cmake在我的项目中所需的所有静态库都不成功

cmake unsuccessful with all static libraries needed in my project

本文关键字:静态 不成功 我的 项目 cmake      更新时间:2023-10-16

我的cmake文件如下:

cmake_minimum_required(VERSION 3.12)
project(ICTSentiClfTest)
set(CMAKE_CXX_STANDARD 14)
INCLUDE_DIRECTORIES(
~/lyy/icttextminingplatform/include
)
LINK_DIRECTORIES(/usr/local/lib/libpthread.a
${PROJECT_SOURCE_DIR}/lib/libGolaxyTAP.a
${PROJECT_SOURCE_DIR}/lib/libWordSeg.a
${PROJECT_SOURCE_DIR}/lib/libwdselicense.a
)
add_executable(ICTSentiClfTest src/NewSentiClassify.cpp)

我在项目的lib目录中有cmake需要的所有lib,但在clion调试中,它出现了对XXX错误的未定义引用:

[ 50%] Linking CXX executable ICTSentiClfTest
CMakeFiles/ICTSentiClfTest.dir/src/NewSentiClassify.cpp.o: In function `SentiClassifyAPI(char const*,golaxytap::common::AutoPtr<golaxytap::trainset::DocReader, golaxytap::common::SharedObj<golaxytap::trainset::DocReader> >)':
/home/yiyi/lyy/1/ICTSentiClfTest/src/NewSentiClassify.cpp:21: undefined reference to `Senti_Classifier_Init'
/home/yiyi/lyy/1/ICTSentiClfTest/src/NewSentiClassify.cpp:32: undefined reference to `Senti_Classify_Perform'
/home/yiyi/lyy/1/ICTSentiClfTest/src/NewSentiClassify.cpp:52: undefined reference to `Senti_Classifier_Exit'
CMakeFiles/ICTSentiClfTest.dir/src/NewSentiClassify.cpp.o: In function `CNNSentiClassifyAPI(char const*)':
/home/yiyi/lyy/1/ICTSentiClfTest/src/NewSentiClassify.cpp:60: undefined reference to `Senti_Classifier_Init'
......

我写的makefile:

all:./src/SentiClassify.cpp 
g++ -o NewSentiClassify ./src/NewSentiClassify.cpp -I/home/yiyi/lyy/icttextminingplatform/include -L./lib -lGolaxyTAP -L./lib -lWordSeg -L./lib -lwdselicense -L./usr/local/lib -lpthread
clean:
rm -f *.o 

使用makefile进行编译不会遇到错误。为什么?我在谷歌上搜索了cmakelist中的link_directories等于g++中的-L,cmakelist的include_directorie等于g++的-I。我的cmakelist文件似乎是正确的,并且与g++编译顺序相同。

在CMakeLists.txt文件中,您应该避免绝对路径(尤其是因为Clion不一定会从您的主目录启动cmake(。

INCLUDE_DIRECTORIES(
<proper-path>/include
)

此外,您似乎不匹配LINK_DIRECTORIES和target_LINK_library。您应该使用以下语句:

add_executable(ICTSentiClfTest src/NewSentiClassify.cpp)
target_link_libraries(ICTSentiClfTest
pthread
lib/libGolaxyTAP.a
lib/libWordSeg.a
lib/libwdselicense.a
)

请注意,默认情况下,/usr/local/lib必须位于LD_LIBRARY_PATH上(链接器在进行链接时将查看的路径(。还要注意,您应该更喜欢target_include_directories,而不是include_directories。