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&lt;string&gt;* listfiles(string),而将其定义为vector&lt;string&gt;* 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) 添加标头参数

NDK 与 cmake 的链接库

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