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.
Related
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.
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 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.
Have anyone used to do with Awesomium framework on Mac OSX? I try to create a sample project and add code in main.m, but it has error
Undefined symbols for architecture i386:
"Awesomium::WebCoreConfig::setCustomCSS(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Do you have any ideas for this error?
main.m is an Objective-C source file and std::__1::basic_string, std::__1::allocator > const& is a C++ class.
Change the name of main.m to main.mm, making it a Objective-C++ source file and try again.
Awesomium is 32 bit only (a current limitation of chromium) while Apple's compiler defaults to 64 bits these days.
You have to compile your app using -m32 (or if using Xcode setting the architecture to 32 bit only as in the link the OP posted)
Example:
clang -m32 awe_test.cpp -o test -framework Awesomium -F$(DIR_WHERE_I_HAVE_AWESOMIUM) -I$(DIR_WHERE_I_HAVE_AWESOMIUM)
I'm working with FFMPEG on Mac OSX, my Mac version is 10.6.8 (i386).
When I try to compile my C++ code linking a dynamic library:
g++ sdk.cpp -rpath /usr/local/lib/libinsight.dylib -o sdk
I get the following error:
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
"av_open_input_file(AVFormatContext**, char const*, AVInputFormat*, int, AVFormatParameters*)", referenced from:
ffmpeg_open(AVFormatContext**, char const*, int*)in ccCkx9dd.o
(so forth fo every FFMPEG call)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Without linking dylib I have no problem. What's the matter?
P.S. ffmpeg version is Mach-O 64-bit executable x86_64
g++ sdk.cpp -rpath /usr/local/lib/libinsight.dylib -o sdk
Shouldn't you be linking to libffmpeg somewhere? Try adding -lffmpeg to your link command line.