符号未加载到模板化函数中

时间:2018-02-20 19:18:29

标签: c++ linux gcc g++

我创建了一个共享库" 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

谢谢!

0 个答案:

没有答案