0

我想我只是犯了一个简单的错误,但我没有得到哪个..无论如何我正在开发一个库,我也在使用 cmake 为项目构建 Makefile:https ://github.com/immapoint/ NaNO3/blob/master/CMakeLists.txt

编译库时一切正常;它构建以下文件:

bin/libNaNO3.dll
lib/libNaNO3.dll.a (I don't like that name as well)

为了测试整个事情,我设置了另一个项目,也使用 cmake。https://github.com/immapoint/NaNO3TestApp/blob/master/CMakeLists.txt

测试库的主文件如下所示: https ://github.com/immapoint/NaNO3TestApp/blob/master/src/main.cpp

但是在编译主文件时,出现以下错误:

CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xbf): undefined reference to `nano::Event<int>::attach(std::function<void(int)> *)`
CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xd3): undefined reference to `nano::Event<int>::notify(int)`
[...]ld.exe: CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj): bad reloc address 0x8 in section `.rdata'

无论我是使用 make/cmake 构建项目还是直接使用编译源文件,都会出现此错误

g++ -Wall -pedantic -ansi -std=c++0x main.cpp [-L./lib -I./include] -lNaNO3 

所以问题似乎不在于cmake,而在于ld。我正在使用 CMake 2.8 版和包含 GCC 4.7.2 版的 MinGW。

附加信息:

带有 -fPIC 的编译器输出: -fPIC

4

1 回答 1

1

这与 CMake 或链接器无关。您需要nano::Event在头文件中包含成员函数的定义,而不是在单独的源文件中,因为模板是在编译时实例化的。当链接器到达那里时,为时已晚。

有关更完整的解释,请参阅为什么模板类的实现和声明应该在同一个头文件中?http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html

于 2013-03-14T22:23:36.427 回答