|
# 如何使用别人生成的库文件libos_cfar_2d.so
如果只有头文件,没有具体实现,则报错:
对‘os_cfar_2d_detection(arma::Mat<float>, std::vector<point_3d, std::allocator<point_3d> >&, OS_CFAR_PARAM&)’未定义的引用
使用的是这个http://www.ai111.vip/thread-1303-1-1.html 里生成的 动态和静态库文件 !
Linux下的库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀
Windows 下.DLL是动态链接库, .LIB是静态链接库
动态库与静态库的区别:
动态库个编译好的程序,程序运行时可以直接调用其中的函数, 不参加工程的编译
而静态库应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用静态库中的函数,在编译时,这些调用的函数都将参加编译
静态库必要的目标代码的是在对程序编译的时候被加入到程序中,而运行时不再需要.a的库了
而动态库,则是在运行时转载
Cannot specify link libraries for target "main" which is not built by this project.
解决办法:要将 add_executable的声明放到设置库文件的target_link_libraries之前
include_directories("./include/")
add_executable(main ${ALL_SRCS}) # 指定生成目标,注意这里要用${ALL_SRCS}!!!
# 如何使用别人生成的库文件
# 添加动态连接库的路径
target_link_libraries(main "/home/jiang/jjj_armadillo_works/libs/libos_cfar_2d.so")
使用target_link_libraries()来链接动态库 ,在make的时候发现,只有使用动态库的绝对路径才行得通,
换成相对路径就不行
这样就不行:target_link_libraries(main "./libs/libos_cfar_2d.so")
报错:
- /usr/bin/ld: 找不到 -l./libs/libos_cfar_2d.so
- collect2: error: ld returned 1 exit status
- CMakeFiles/main.dir/build.make:144: recipe for target 'main' failed
复制代码
或者:
在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:
亲测:link_directories用在add_executable之前,target_link_libraries用在add_executable之后
# 包含自己的头文件目录
include_directories("./include/")
# 包含自己的库文件目录
link_directories("./libs/")把该路径添加到第三方库搜索路径中,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了
add_executable(main ${ALL_SRCS}) # 指定生成目标,注意这里要用${ALL_SRCS}!!!
# 如何使用别人生成的库文件
# 添加动态连接库的路径
target_link_libraries(main -los_cfar_2d) 或 target_link_libraries(main os_cfar_2d)
- cmake_minimum_required (VERSION 3.15)
- project (main)
- SET(CMAKE_CXX_STANDARD 14)
- #SET(CMAKE_C_STANDARD 11)
- #aux_source_directory(. ALL_SRCS) # 添加当前目录下所有的源文件
- # set(ALL_SRCS "vibe的使用_用了armadillo.cpp" "vibe.cpp" "vibe.h")
- # set(ALL_SRCS "bp_img_4T4R_os_cfar.cpp" "TimerClock.hpp" "os_cfar_2d.h" "os_cfar_2d.cpp" "point_3d.hpp" "typedef.h")
- set(ALL_SRCS "os_cfar_2d_grid_search.cpp")
- include_directories("./include/")
- #add_subdirectory(lib) # 添加lib子目录
- add_executable(main ${ALL_SRCS}) # 指定生成目标,注意这里要用${ALL_SRCS}!!!
- # message(WARNING "我说:lib目录里的文件编译成动态库再由main函数调用")
- #target_link_libraries(main power) # 添加链接库,power是在lib子目录的CMakeLists中定义的
- # 如何使用别人生成的库文件
- # 添加动态连接库的路径
- target_link_libraries(main "/home/jiang/jjj_armadillo_works/libs/libos_cfar_2d.so")
- #find_package(FFTW3f)
- #target_link_libraries(main -lboost_system -lboost_thread -lfftw3f -lpthread)
- #add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
- # If you have installed Armadillo via the cmake installer,
- # use the following command to compile your programs:
- # g++ prog.cpp -o prog -O2 -std=c++11 -larmadillo
- target_link_libraries(main armadillo)
- # 官方链接:https://gitlab.com/conradsnicta/armadillo-code
- # 冲突如何解决?
- # /usr/bin/ld: warning: libarmadillo.so.8, needed by //usr/lib/libgdal.so.20, may conflict with libarmadillo.so.10
- # c++使用opencv库的CMakeLists.txt文件配置Demo
- find_package(OpenCV REQUIRED)
- #显示OpenCV_INCLUDE_DIRS的值
- message("opencv头文件目录:" ${OpenCV_INCLUDE_DIRS})
- message("opencv的版本信息:" ${OpenCV_VERSION})
- message("opencv的库文件信息:" ${OpenCV_LIBS})
- #添加OpenCV头文件
- include_directories(${OpenCV_INCLUDE_DIRS})
- # 将库文件链接到可执行程序main上
- target_link_libraries(main ${OpenCV_LIBS})
- # cmake方式依赖Python头文件和库文件的配置
- find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
- find_package(Python3 COMPONENTS NumPy)
- find_package(PythonLibs REQUIRED)
- # python的头文件 PYTHON_INCLUDE_DIRS
- message("python的头文件目录:" ${PYTHON_INCLUDE_DIRS})
- include_directories(${PYTHON_INCLUDE_DIRS})
- # python的库文件 PYTHON_LIBRARIES
- # 解决报错: fatal error: Python.h: 没有那个文件或目录
- message("python的库文件信息:" ${PYTHON_LIBRARIES})
- target_link_libraries(main ${PYTHON_LIBRARIES})
复制代码
- cmake_minimum_required (VERSION 3.15)
- project (main)
- SET(CMAKE_CXX_STANDARD 14)
- #SET(CMAKE_C_STANDARD 11)
- #aux_source_directory(. ALL_SRCS) # 添加当前目录下所有的源文件
- # set(ALL_SRCS "vibe的使用_用了armadillo.cpp" "vibe.cpp" "vibe.h")
- # set(ALL_SRCS "bp_img_4T4R_os_cfar.cpp" "TimerClock.hpp" "os_cfar_2d.h" "os_cfar_2d.cpp" "point_3d.hpp" "typedef.h")
- set(ALL_SRCS "os_cfar_2d_grid_search.cpp")
- include_directories("./include/")
- link_directories("./libs/")
- #add_subdirectory(lib) # 添加lib子目录
- add_executable(main ${ALL_SRCS}) # 指定生成目标,注意这里要用${ALL_SRCS}!!!
- # message(WARNING "我说:lib目录里的文件编译成动态库再由main函数调用")
- #target_link_libraries(main power) # 添加链接库,power是在lib子目录的CMakeLists中定义的
- # 如何使用别人生成的库文件
- # 添加动态连接库的路径
- target_link_libraries(main os_cfar_2d)
- # target_link_libraries(main "/home/jiang/jjj_armadillo_works/libs/libos_cfar_2d.so")
- #find_package(FFTW3f)
- #target_link_libraries(main -lboost_system -lboost_thread -lfftw3f -lpthread)
- #add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
- # If you have installed Armadillo via the cmake installer,
- # use the following command to compile your programs:
- # g++ prog.cpp -o prog -O2 -std=c++11 -larmadillo
- target_link_libraries(main armadillo)
- # 官方链接:https://gitlab.com/conradsnicta/armadillo-code
- # 冲突如何解决?
- # /usr/bin/ld: warning: libarmadillo.so.8, needed by //usr/lib/libgdal.so.20, may conflict with libarmadillo.so.10
- # c++使用opencv库的CMakeLists.txt文件配置Demo
- find_package(OpenCV REQUIRED)
- #显示OpenCV_INCLUDE_DIRS的值
- message("opencv头文件目录:" ${OpenCV_INCLUDE_DIRS})
- message("opencv的版本信息:" ${OpenCV_VERSION})
- message("opencv的库文件信息:" ${OpenCV_LIBS})
- #添加OpenCV头文件
- include_directories(${OpenCV_INCLUDE_DIRS})
- # 将库文件链接到可执行程序main上
- target_link_libraries(main ${OpenCV_LIBS})
- # cmake方式依赖Python头文件和库文件的配置
- find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
- find_package(Python3 COMPONENTS NumPy)
- find_package(PythonLibs REQUIRED)
- # python的头文件 PYTHON_INCLUDE_DIRS
- message("python的头文件目录:" ${PYTHON_INCLUDE_DIRS})
- include_directories(${PYTHON_INCLUDE_DIRS})
- # python的库文件 PYTHON_LIBRARIES
- # 解决报错: fatal error: Python.h: 没有那个文件或目录
- message("python的库文件信息:" ${PYTHON_LIBRARIES})
- target_link_libraries(main ${PYTHON_LIBRARIES})
复制代码
|
|