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.
Related
I have a library that is written in a mixture of Fortran and C++. It also uses MPI at the Fortran layer. Let's say a user wants to link a new c++ program against my library. From what I've found on the internet, the best way to do this is to have them compile their code with a C++ compiler, and link against my library using the mpif90 fortran wrapper. This is to make sure you link against the correct version of MPI. But in order to make this all work, you also have to link against libc++ explicitly because otherwise your c++ program won't work. So, for example:
mpic++ their_code.cc -c
mpif90 their_code.o -o program.exe -lmylib -lstdc++
This approach has worked fine for me across many platforms and compilers (gnu, intel, etc). It also worked for clang, until the release of Xcode 9.0, which broke this process. The compiler errors appear to be related to incompatibility in the c++ standard library, because it only breaks when I call functions that pass std::string. In the Xcode release notes it says:
Projects created using this Xcode release use the new libc++ implementation of the standard C++ library. The libc++ library is available only on iOS 5.0 and later and OS X 10.7 and later. 12221787
To enable deployment on earlier releases of iOS and OS X in your project, set the C++ Standard Library build setting to libstdc++ (Gnu C++ standard library).
This leads me to believe I need to modify how I link against libc++. You can reproduce this issue with the following code (assuming you have upgraded Xcode to version 9).
main.cc:
#include<string>
using namespace std;
void fun_str(string s);
void fun_num(int n);
int main() {
string my_str = "test";
int my_num = 1;
fun_str(my_str);
fun_num(my_num);
return 0;
}
fun.cc:
#include <string>
using namespace std;
void fun_str(string s) {}
void fun_num(int n) {}
Makefile:
test: main.o fun.o
mpif90 main.o fun.o -o program.exe -lstdc++
main.o: main.cc
mpic++ main.cc -c
fun.o: fun.cc
mpic++ fun.cc -c
Notice how if you remove all the references to strings, it does compile correctly. But if not, you get the following error:
mpic++ main.cc -c
mpic++ fun.cc -c
mpif90 main.o fun.o -o program.exe -lstdc++
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from:
_main in main.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
_main in main.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [test] Error 1
Additionally, if you switch to GNU by setting the environment variable OMPI_CXX to g++-7, it also compiles without a hitch. So this is definitely just a Clang issue, that only showed up in the new version. Any help would be greatly appreciated :)!
I fixed this on my own, but using -lc++ instead of -lstdc++. It seems that libstdc++ is depreciated with clang.
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.
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.
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.
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.