Link external library GCC OS X - gcc

I have installed GCC 4.7.2 and GMP 5.1.0 and I've written this simple code in main.cpp locate at ~/Desktop:
#include <iostream>
#include <gmp.h>
using namespace std;
int main ()
{
mpz_t a;
mpz_init(a);
mpz_set_ui(a, 42);
cout << "Hello, world!" << endl;
}
I compile it with:
$ g++ main.cpp -o exe
but I get this error message:
Undefined symbols for architecture x86_64:
"___gmpz_init", referenced from:
_main in ccC0FXun.o
"___gmpz_set_ui", referenced from:
_main in ccC0FXun.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
I think it's because it doesn't find the GMP library, am I right?
So how can I link an external library such as GMP in GCC?

Your program works fine for me here using:
g++ main.cpp -o exe -lgmp
Check the GCC documentation for a description of the -l flag.

Related

SFML, GCC, and undefined symbol for sf::String

I have gcc 8.1.0 installed through homebrew on macOS 10.13.4. I installed sfml 2.4.2_1 through homebrew as well. When I compile this file:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode().getDesktopMode(), "My Window");
while (window.isOpen())
{
sf::Event event;
while(window.pollEvent(event))
{
window.clear();
if (event.type == sf::Event::Closed)
{
window.close();
}
}
}
return 0;
}
with g++-8 sfmltest.cpp -o sfmltest -lsfml-system -lsfml-graphics -lsfml-window -lsfml-audio -lsfml-network
I get an undefined reference to sf::String:
Undefined symbols for architecture x86_64:
"sf::String::String(char const*, std::locale const&)", referenced from:
_main in cciQ649w.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
I realize that I shouldn't need all of those libraries. I was including them hoping to get rid of the undefined symbols error. If I compile the same file with the same libraries using clang++, everything compiles just fine.
My guess is that homebrew is using clang to compile and install sfml and that the produced abi is incompatible with gcc. Can anyone confirm this? Is this something that I can fix? It's no problem to use clang++ for me. I would prefer to use g++ just because I want to.

FFMPEG library usage for own C++ project

I would like to create my own project using FFMPEG to build a player, but creating a new file to include ffmpeg library seems not easy. I have configure the ffmpeg and make build.
./configure
./make
The ffmpeg hello world program (myffmpeg.c):
#include <libavformat/avformat.h>
int main(int argc, char *argv[]) {
av_register_all();
return 0;
}
but it shows
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
Undefined symbols for architecture x86_64:
"av_register_all()", referenced from:
_main in myffmpeg-61ec1b.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation
When I try to link the allformats.o file, which has av_register_all function inside. I got:
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
Undefined symbols for architecture x86_64:
"_av_register_input_format", referenced from:
_register_all in allformats.o
"_av_register_output_format", referenced from:
_register_all in allformats.o
"_avcodec_register_all", referenced from:
_register_all in allformats.o
"_ff_a64_muxer", referenced from:
_register_all in allformats.o
...
"_ff_yuv4mpegpipe_muxer", referenced from:
_register_all in allformats.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
It should be my bad Makefile knowledge, could anyone give me some hint on how to call ffmpeg library functions? Or even how to modify the Makefile to build my own program? Thanks!
*Update:
It could be my compiling command problem, is it the way to compile?
g++ myffmpeg.c
maybe the problem is that c++ is decorating functions. So the same function compiled with C compiler and C++ looks different to linker. try this:
extern "C"
{
#include <libavformat/avformat.h>
}
this code means that you told your compiler to not decorate functions in that file.
I think I could answer myself.
g++ -o main.o main.c `pkg-config --cflags --libs libavformat`
I don't know the reason now, it is from https://soledadpenades.com/2009/11/24/linking-with-ffmpegs-libav/
We still need the extern, see answer below.

JNI build C file (Undefined symbols for architecture x86_64)

I'm trying to build a .c file on OSX but I keep getting:
Undefined symbols for architecture x86_64
#include "Test.h"
JNIEXPORT jint JNICALL Java_Test_test
(JNIEnv * env, jclass cls, jbyteArray s, jlong ss, jbyteArray sss, jlong ssss, jbyteArray sssss, jlong ssssss) {
/*printf("Hello World!\n");*/
return 1;
}
Built with:
clang++ -o test -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include/darwin Test.cpp
Undefined symbols for architecture x86_64: "_main", referenced from:
implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Is there something I need to install?
clang++ -o test Test.cpp is trying to compile and link to produce a runnable executable. You didn't define main(), so of course this fails when it tries to link the CRT code (which calls the user-supplied main().)
Perhaps you meant to use clang++ -fPIC -shared -o libtest.so Test.cpp -I... (keeping all the other options the same), to make a shared library like JNI needs. Or .dylib or .jnilib, whatever libraries are normally called on your platform.
If you're following a tutorial that didn't tell you how to compile your code, it's probably not a very good tutorial and you should find better documentation.

Compiling minimal project with SFML 2.1 on mac os x

I'm trying to compile minimal project with SFML on mac os x. I'm using the following command:
g++ -o rj -framework SFML -lsfml-graphics -lsfml-audio -lsfml-window -lsfml-system main.cpp
with following code:
# include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "test");
return 0;
}
and getting an error:
Undefined symbols for architecture x86_64:
"sf::String::String(char const*, std::__1::locale const&)", referenced from:
_main in main-15430b.o
ld: symbol(s) not found for architecture x86_64
What am i doing wrong?
The problem solved by installing the clang version of library.

"Undefined symbols for architecture x86_64:" when compiling lex and yacc

Lex and Yacc work, but when I try to compile the y.tab.c file, I'm getting the following error. I have a feeling its a linking issue where compiler can't find the library that it needs, but I have no idea how to fix it.
In my nor.y file, I have this at the top:
%{
#include <stdio.h>
%}
In my nor.l file, I have this at the top:
%{
#include "y.tab.h"
#include <stdlib.h>
extern YYSTYPE yylval;
%}
Then, when I try to compile with
gcc y.tab.h -ly -ll
I get the error:
Undefined symbols for architecture x86_64:
"_yyparse", referenced from:
_main in liby.a(main.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
You need to compile the .c files, not the header file:
gcc y.tab.c lex.yy.c -ly -ll

Resources