我创建了一个共享库" A" ,它使用其他共享库" B" 。
当我将程序与共享库" A" 链接时,我遇到了问题。
当我在共享库的cpp文件中使用其他共享库(" B" )中的某些功能" A" ,一切都很好。
但是当我在共享库" A" 中的.h文件(模板化方法或内联方法)中使用这些函数时,符号未加载而且我得到一个错误"未定义的符号引用"。
我使用的是g ++ 7.2。 我认为选项-l忘记加载头文件中使用的符号。
你有想法避免这个吗?
更新2:
这是一个完整的可重复示例:
A.cpp
#include "A.h"
A.H
#ifndef A_H
# define A_H
#include <type_traits>
#include "B.h"
class A
{
public:
template <typename Type>
std::enable_if_t<std::is_arithmetic<Type>::value,void> funcA(Type value);
};
template <typename Type>
std::enable_if_t<std::is_arithmetic<Type>::value,void> A::funcA(Type value)
{
B tmp;
tmp.funcB(value);
}
#endif
B.cpp
#include "B.h"
#include <iostream>
void B::example()
{
std::cout << "works" << std::endl;
}
B.h
#ifndef B_H
# define B_H
class B
{
public:
void funcB(int value);
private:
void example();
};
inline void B::funcB(int value)
{
value += 1;
example();
}
#endif
的main.cpp
#include "A.h"
int main()
{
A tmp;
tmp.funcA(5);
return 1;
}
编译
g++ -std=c++17 -m64 -O2 -DNDEBUG -Wall -Wextra -Werror -fPIC -o A.o -c A.cpp
g++ -std=c++17 -m64 -O2 -DNDEBUG -Wall -Wextra -Werror -fPIC -o B.o -c B.cpp
g++ -std=c++17 -m64 -O2 -DNDEBUG -Wall -Wextra -Werror -fPIC -o main.o -c main.cpp
g++ -o libB.so B.o -shared
g++ -o libA.so A.o -shared -L. -lB
g++ -o application main.o -L . -lA
错误
main.o: In function `main':
main.cpp:(.text.startup+0x1a): undefined reference to `B::example()'
collect2: error: ld returned 1 exit status
谢谢,
解决:
最后,我用这个帖子解决了我的问题: GCC 4.5 vs 4.4 linking with dependencies
谢谢!