This question already has answers here:
Why does the order in which libraries are linked sometimes cause errors in GCC?

(9个答案)


3年前关闭。




SFML定义的符号有链接器错误,但是尽管链接了lib,但我看不到它们如何发生。
我使用的是make,目前我正在学习,我想用它构建一个简约的开发环境。

如果您需要以下以外的其他信息,请打个招呼。我只想最小化问题的大小。

XXX@XXX ~/Documents/dev/cpp/proj/beep $ make clean
rm -f build/*.o build/release/*.o build/debug/*.o build/test/*.o
XXX@XXX ~/Documents/dev/cpp/proj/beep $ make tests
//test obj first
g++ -std=c++14 -Wall -pthread -Iinclude   -c test/Packager.ut.cpp -o   build/test/Packager.ut.o -g3
//now the src obj
g++ -std=c++14 -Wall -pthread -Iinclude   -c src/ClientAddress.cpp -o build/debug/ClientAddress.o -g3
g++ -std=c++14 -Wall -pthread -Iinclude   -c src/Packager.cpp -o build/debug/Packager.o -g3
g++ -std=c++14 -Wall -pthread -Iinclude   -c src/Package.cpp -o build/debug/Package.o -g3
Built debug object files.
//now the first test itself
g++ -std=c++14 -Wall -pthread -Iinclude  -lsfml-network  build/test/Packager.ut.o build/debug/ClientAddress.o build/debug/Packager.o build/debug/Package.o -g3  -o bin/test/Packager.ut
build/test/Packager.ut.o: In function `main':
/home/XXX/Documents/dev/cpp/proj/beep/test/Packager.ut.cpp:69: undefined reference to `sf::IpAddress::IpAddress(char const*)'
build/debug/ClientAddress.o: In function `nw::udp::ClientAddress::ClientAddress()':
/home/XXX/Documents/dev/cpp/proj/beep/src/ClientAddress.cpp:21: undefined reference to `sf::IpAddress::IpAddress(char const*)'
build/debug/ClientAddress.o: In function `nw::udp::operator==(nw::udp::ClientAddress const&, nw::udp::ClientAddress const&)':
/home/XXX/Documents/dev/cpp/proj/beep/src/ClientAddress.cpp:33: undefined reference to `sf::operator==(sf::IpAddress const&, sf::IpAddress const&)'
...

依此类推...在文件中引用sf::的所有内容

如果尝试编译其他测试,则会得到相同的错误模式(例如,对于ClientAddress)

当然,我现在想知道我在哪里错误地链接了什么。如您所见,该库与-lsfml-network链接。我还检查了SMFL的安装,因此,至少在标准目录中缺少lib文件的可能性较小。

我猜我在使用g++,编译和链接命令或smth时出现错误。

我的项目树:
>bin
----mainexec
--->test
    ----.ut
>build
--->debug
    ----.o
--->release
    ----.o
--->test
    ----.ut.o
>src
---- .cpp
>include
---- .h
>test
---- .ut.cpp

作为问题的第二部分,我想问一下是否有更好的构建测试的方法,因为我只是简单地将每个src-obj链接到我的test-obj,即使链接的src-obj比它更多实际需要。它应该可以工作,并且我不必一直保持测试依赖性,这以后会很麻烦。有什么共同点?

最佳答案

sfml-network依赖于sfml-system。尝试在makefile的链接器命令中的-lsfml-system之前添加-lsfml-network

08-25 08:47
查看更多