使用cmake的共享库的未定义引用

时间:2014-07-06 23:23:44

标签: c++ linker cmake

我看了很多找到这个答案,但我找不到任何与我的情况相关的东西。这似乎很容易,这就是为什么这太令人沮丧了。

我正在用CMAKE建立一个项目。我正在生成两个共享库。一个包括另一个。我也在生成一个可执行文件。可执行文件链接到封装另一个的共享库。以下是代码的相关部分:

################################################################################ 
# Make the shared libraries                                                             
################################################################################ 
# Standard stuff                                                                 
add_library(er SHARED src/std_math.cc src/snapshot.cc)                           
include_directories(hdr)                                                         
target_link_libraries(er rt)                                                     

# DSP library                                                                    
add_library(dsp SHARED src/dsp.cc)                                               
include_directories(hdr)                                                         
target_link_libraries(dsp er /usr/lib/libfftw3f.so /usr/lib/libfftw3.so)         

################################################################################ 
# Make an Executable                                                             
################################################################################ 
message("-- Making executable for testing --")                                   
add_executable(er_test test/dsp_test.cc)                                         
include_directories(hdr)                                                         
target_link_libraries(er_test dsp)                                               

################################################################################ 
# What to do with make install                                                   
################################################################################ 
message ("-- Writting install scripts --")                                       

# See if there is an install directory already assigned.  If not, set it to the  
# system default.                                                                
if (NOT DEFINED INSTALL_DIR)                                                     
    set (INSTALL_DIR /usr/local/)                                                
endif (NOT DEFINED INSTALL_DIR)                                                  
message ("  -- install_dir = ${INSTALL_DIR}")                                    

# Install the libraries and header files to the appropriate places               
install (TARGETS er dsp DESTINATION ${INSTALL_DIR}/bin)                          
install (FILES hdr/dsp.hh hdr/snapshot.hh hdr/std_math.hh DESTINATION ${INSTALL_DIR}/include)

这是我得到的错误。

CMakeFiles/er_test.dir/test/dsp_test.cc.o: In function `main':
dsp_test.cc:(.text.startup+0x11e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x142): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x166): undefined reference to `std::vector<int, std::allocator<int> > subvec<int>(std::vector<int, std::allocator<int> > const&, int, int, int)'
dsp_test.cc:(.text.startup+0x182): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x1b6): undefined reference to `std::vector<int, std::allocator<int> > subvec<int>(std::vector<int, std::allocator<int> > const&, int, int, int)'

还有更多来自那里的人。我已经尝试过使用静态库,但它只是将问题推迟到下一个可执行文件我尝试将这些库包含进去。我也试过用g ++而不是c ++。我尝试过更换图书馆订单。此外,它不是模板问题,因为它找不到的参考文件中的至少一个不是模板化函数。我在库中搜索了这些符号,我能够找到它们,尽管它们是由随机字符组成的前缀和后缀。

我不明白发生了什么。请帮忙。

谢谢,

更新

我找到了另一个链接,特别是this one,它提到了add_subdirectory的潜在问题。这是另一个项目的子项目。所以我发送到项目并在那里建造。有效!但它仍然无法在父目录中工作。也许这可以给某人提供线索。

再次感谢,

1 个答案:

答案 0 :(得分:4)

不要假设包含CMakeLists.txt的目录是运行时的当前目录。相反,只要您想要相对于CMakeLists.txt的路径,请使用${CMAKE_CURRENT_SOURCE_DIR}。例如:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/hdr)