gpt4 book ai didi

c++ - undefined reference (g++ 静态库编译)

转载 作者:行者123 更新时间:2023-11-30 01:22:44 24 4
gpt4 key购买 nike

工程文件如下:

source
parser
parser.cpp
parser.hpp
brain
brain.cpp
brain.hpp

我首先运行了这两个命令(pwd source/brain/):

g++ -c brain.cpp -o brain.o
ar rvs brain.a brain.o

我将 brain.abrain.hpp 都复制到了 source/parser/。然后我运行了这个命令(pwd source/parser):

g++ parser.cpp brain.a -o parser

我得到了这个错误:

/tmp/cceGRLZn.o: In function `main':
parser.cpp:(.text+0x1cc): undefined reference to `std::brain<long long>::brain()'
parser.cpp:(.text+0x205): undefined reference to `std::brain<long long>::init(int)'
parser.cpp:(.text+0x26b): undefined reference to `std::brain<long long>::work()'
parser.cpp:(.text+0x2a4): undefined reference to `std::brain<long long>::clear()'
parser.cpp:(.text+0x2ec): undefined reference to `std::brain<long long>::~brain()'
parser.cpp:(.text+0x322): undefined reference to `std::brain<long long>::~brain()'
/tmp/cceGRLZn.o: In function `int parser_extract_args<long long>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, short&, std::brain<long long>&)':
parser.cpp:(.text._Z19parser_extract_argsIxEiRSsiRsRSt5brainIT_E[int parser_extract_args<long long>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, short&, std::brain<long long>&)]+0x17b): undefined reference to `std::brain<long long>::push_back(long long)'
parser.cpp:(.text._Z19parser_extract_argsIxEiRSsiRsRSt5brainIT_E[int parser_extract_args<long long>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, short&, std::brain<long long>&)]+0x37a): undefined reference to `std::brain<long long>::push_back(long long)'
collect2: ld returned 1 exit status

源文件:

brain.cpp [http://ideone.com/GNUxmH][1]
brain.hpp [http://ideone.com/M2IFAI][2]
parser.cpp [http://ideone.com/fJRzhD][3]
parser.hpp [http://ideone.com/mj6dST][4]

我该怎么办?

最佳答案

第一件事:不要将任何实体添加到std 命名空间。这给您的程序未定义的行为

从您的消息来看,您似乎已将名为 brain 的类添加到 std 命名空间。从 std 命名空间中删除 brain 并将其放入您的某个命名空间中。唯一可以添加到 std 命名空间的是属于 std 命名空间的模板的特化

其次,除非您提供在整个程序中使用的类模板的显式实例化您应该将类​​模板的成员函数的定义放在包含它们的声明,以确保它们从实例化点可见。

将它们归类到单独的 .cpp 文件中,使得编译器无法为您从其他翻译单元调用的成员函数生成代码,而不是包含其定义的翻译单元。 This Q&A on StackOverflow也可能对您有所帮助。

关于c++ - undefined reference (g++ 静态库编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com