CMAKE LINKING ERROR 与用户定义的共享库
Posted
技术标签:
【中文标题】CMAKE LINKING ERROR 与用户定义的共享库【英文标题】:CMAKE LINKING ERROR with a user-defined shared library 【发布时间】:2014-05-22 15:26:08 【问题描述】:我是 cmake 世界的新手。当我在 C++ 中尝试一些基本的 cmake 配置时,出现了这个问题。准确地说,以下是我的目录结构:
/src----
|-> CMakeLists.txt
|-> main.cpp
|-> lib----
|-> libfsystem.so
|->filesystem----
|->CMakeLists.txt
|->listfiles.cpp
|->include-----
|->fsystem.h
现在,/src/filesystem/CMakeLists.txt 文件是这样的
cmake_minimum_required(VERSION 2.8)
project(fsystem)
set(CMAKE_BUILD_TYPE Release)
link_directories($CMAKE_CURRENT_SOURCE_DIR/build)
find_package(Boost REQUIRED system filesystem)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $CMAKE_CURRENT_SOURCE_DIR/../lib)
include_directories($CMAKE_CURRENT_SOURCE_DIR/include)
add_library(fsystem SHARED listfiles.cpp)
而/src/CMakeLists.txt文件是这样的
cmake_minimum_required(VERSION 2.8)
project(vessel_detect)
add_subdirectory(filesystem)
add_executable(main main.cpp)
set(CMAKE_LIBRARY_PATH $CMAKE_CURRENT_SOURCE_DIR/lib)
find_library(libpath fsystem)
MESSAGE($libpath)
target_link_libraries(main $libpath)
-
库 libfsystem.so 已成功创建。
库libfsystem.so也被/src/CMakeLists.txt成功找到
但是,当 main.cpp 的链接完成时,它会给我一些未定义的引用错误,这些错误不应该发生,因为所有内容都已定义。为了更加完整,以下是 main.cpp 文件的内容
Main.cpp
#include<iostream>
#include"filesystem/include/fsystem.h"
using namespace std;
int main(void)
string path ("~");
vector<string>* output;
output = listfiles(path);
return 0;
listfiles.cpp的内容是
listfiles.cpp
#include"fsystem.h"
using namespace boost::filesystem;
vector<string>* listfiles(int argc, char* argv[])
if (argc<2)
std::cout<<"No file name provided"<<std::endl;
else
path p(argv[1]);
vector<string>* output;
if (exists(p))
if(is_directory(p))
std::cout<<"You specified a directory"<<std::endl;
std::cout<<"Its contents are as follows :-"<<std::endl;
typedef std::vector<path> vec;
vec v;
copy(directory_iterator(p),directory_iterator(),back_inserter(v));
sort(v.begin(),v.end());
for(vec::const_iterator it(v.begin());it!=v.end();++it)
output->push_back(it->filename().string());
// std::cout<<it->filename()<<std::endl;
else if (is_regular_file(p))
std::cout<<argv[1]<<" "<<file_size(p)<<std::endl;
else
std::cout<<"The file is neither a directory nor a regular file"<<std::endl;
else
std::cout<<"The speicified path does not exist"<<std::endl;
最后,fsystem.h 的内容是:
fsystem.h
#ifndef _fsystem_h
#define _fsystem_h
#include<iostream>
#include<string>
#include<vector>
#include"boost/filesystem.hpp"
using namespace std;
vector<string>* listfiles(string);
#endif
有人可以为我在链接 main.cpp 期间遇到未定义的参考错误提供一个原因吗?如果您能为我提供此问题的解决方案,我也将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:你没有链接提升。您需要将target_link_libraries(fsystem $Boost_LIBRARIES)
添加到/src/filesystem/CMakeLists.txt 的末尾,并在find_package 和add_library 之间添加include_directories($Boost_INCLUDE_DIRS)
。
cmake_minimum_required(VERSION 2.8)
project(fsystem)
set(CMAKE_BUILD_TYPE Release)
link_directories($CMAKE_CURRENT_SOURCE_DIR/build)
find_package(Boost REQUIRED system filesystem)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $CMAKE_CURRENT_SOURCE_DIR/../lib)
include_directories($CMAKE_CURRENT_SOURCE_DIR/include)
include_directories($Boost_INCLUDE_DIRS)
add_library(fsystem SHARED listfiles.cpp)
target_link_libraries(fsystem $Boost_LIBRARIES)
【讨论】:
【参考方案2】:(1) 对于TARGET_LINK_LIBRARIES
,您应该输入目标的名称,因此:
TARGET_LINK_LIBRARIES(main fsystem)
(2) 将列表文件声明为vector<string>* listfiles(string)
,而将其定义为vector<string>* listfiles(int,char**)
此外,您需要根据其他回复链接 Boost。
【讨论】:
关于您的第二点,我意识到这一点。但是,在 fsystem.h 中,当我使用 int argc char* argv[]) 时,它会给我带来错误,例如 argc 未在范围内定义。实际上 listfiles.cpp 是我从其他项目中获取的另一个代码 sn-p。在那里我使用了 argc 和 argv 参数。但是,当我在 fsystem.h 中定义原型时,它给了我关于 argc 和 argv 在当前范围内未声明的错误。以上是关于CMAKE LINKING ERROR 与用户定义的共享库的主要内容,如果未能解决你的问题,请参考以下文章
CMake error:System Error:No such file or directory CMake error:Could not open file for write in cop
如何在 Linking.openURL(url) 添加标头参数
Android--Android resource linking failed报错解决
已解决CMake Error: Cannot determine link language for target “xxx“. CMake Error: CMake can not determ
已解决CMake Error: Cannot determine link language for target “xxx“. CMake Error: CMake can not determ