与用户定义的共享库链接错误

CMAKE LINKING ERROR with a user-defined shared library

本文关键字:链接 错误 共享 用户 定义      更新时间:2023-10-16

我是一个新手。当我在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})
  1. 图书馆借阅系统。
  2. 图书馆借阅系统。/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的链接期间得到的未定义的引用错误?如果您能给我一个解决这个问题的办法,我也会很感激的。

谢谢

您没有链接boost。target_link_libraries(fsystem ${Boost_LIBRARIES})需要添加到/src/filesystem/CMakeLists.txt文件末尾,include_directories(${Boost_INCLUDE_DIRS})需要添加到find_package和add_library文件之间。

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})

(1)对于TARGET_LINK_LIBRARIES,您应该输入目标的名称,因此:

TARGET_LINK_LIBRARIES(main fsystem)

(2)您将listfiles声明为vector<string>* listfiles(string),而将其定义为vector<string>* listfiles(int,char**)

此外,您需要与Boost链接到其他回复