我想我只是犯了一个简单的错误,但我没有得到哪个.. 无论如何我正在创建一个库,我也在使用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和MinGW包含GCC版本4.7.2。
其他信息:
使用-fPIC的编译器输出:
答案 0 :(得分:0)
这与CMake或链接器无关。您需要在标头中包含nano::Event
成员函数的定义,而不是在单独的源文件中,因为模板在编译时实例化。当链接器到达那里时,为时已晚。
要获得更全面的解释,请参阅Why should the implementation and the declaration of a template class be in the same header file?和http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html