C++ CMake初学者';s问题:包含第三方库的项目未编译

C++ CMake初学者';s问题:包含第三方库的项目未编译,c++,cmake,xml-rpc,external-library,C++,Cmake,Xml Rpc,External Library,因此,我现在与克马克纠缠了一段时间。我想使用来自的xmlrpc-c库。因此,我用main.cpp和CMakeLists.txt启动了一个新项目,并将xmlrpc-c作为子目录复制到我的项目中(因为不幸的是,xmlrpc-c不是一个cmake库): 我的代码就是其中的一个示例,如下所示: #include <iostream> #include <string> #include "xmlrpc-c/include/xmlrpc-c/base.hpp"

因此,我现在与克马克纠缠了一段时间。我想使用来自的xmlrpc-c库。因此,我用main.cpp和CMakeLists.txt启动了一个新项目,并将xmlrpc-c作为子目录复制到我的项目中(因为不幸的是,xmlrpc-c不是一个cmake库):

我的代码就是其中的一个示例,如下所示:

#include <iostream>
#include <string>
#include "xmlrpc-c/include/xmlrpc-c/base.hpp"
#include "xmlrpc-c/include/xmlrpc-c/registry.hpp"
#include "xmlrpc-c/include/xmlrpc-c/server_abyss.hpp"

using namespace std;

class hello : public xmlrpc_c::method
{
public:
    void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
    {
        string msg(params.getString(0));
        params.verifyEnd(1);

        cout << msg << endl;

        *retval = xmlrpc_c::value_string("XMLRPC server says hello!");
    }
};

int main(int argc, char** argv)
{
    xmlrpc_c::registry registry;
    registry.addMethod("hello", new hello);

    xmlrpc_c::serverAbyss server(xmlrpc_c::serverAbyss::constrOpt().registryP(&registry).portNumber(8080));
    server.run();

    return 1;
}
我的问题是,我的构建过程失败,出现了链接器错误:据我所知,头文件
registry.hpp
没有正确包含。如果我注释掉代码行
registry.addMethod(“hello”,newhello),我可以编译程序没有任何错误

====================[ Build | xmlrpc_c_server | Debug ]=========================
/usr/bin/cmake --build /mnt/c/Users/valentin.ackva/CLionProjects/xmlrp-c-server/cmake-build-debug --target xmlrpc_c_server -- -j 9
Scanning dependencies of target xmlrpc_c_server
[ 50%] Building CXX object CMakeFiles/xmlrpc_c_server.dir/main.cpp.o
[100%] Linking CXX executable xmlrpc_c_server
/usr/bin/ld: CMakeFiles/xmlrpc_c_server.dir/main.cpp.o: in function `main':
/mnt/c/Users/struppel/CLionProjects/xmlrp-c-server/main.cpp:31: undefined reference to `xmlrpc_c::registry::addMethod(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, xmlrpc_c::method*)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/xmlrpc_c_server.dir/build.make:84: xmlrpc_c_server] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/xmlrpc_c_server.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/xmlrpc_c_server.dir/rule] Error 2
make: *** [Makefile:118: xmlrpc_c_server] Error 2
============================[Build | xmlrpc | u c|u server | Debug]=========================
/usr/bin/cmake--build/mnt/c/Users/valentin.ackva/CLionProjects/xmlrp-c-server/cmake-build-debug--target xmlrpc_c_服务器---j 9
扫描目标xmlrpc_c_服务器的依赖项
[50%]构建CXX对象CMakeFiles/xmlrpc_c_server.dir/main.cpp.o
[100%]链接CXX可执行xmlrpc_c_服务器
/usr/bin/ld:cmakfiles/xmlrpc_c_server.dir/main.cpp.o:在函数“main”中:
/mnt/c/Users/struppel/CLionProjects/xmlrp-c-server/main.cpp:31:xmlrpc_c::registry::addMethod(std:_cx11::basic_string,xmlrpc_c::method*)的未定义引用
collect2:错误:ld返回了1个退出状态
make[3]:***[CMakeFiles/xmlrpc_c_server.dir/build.make:84:xmlrpc_c_server]错误1
make[2]:***[CMakeFiles/Makefile2:76:CMakeFiles/xmlrpc_c_server.dir/all]错误2
make[1]:***[CMakeFiles/Makefile2:83:CMakeFiles/xmlrpc_c_server.dir/rule]错误2
make:**[Makefile:118:xmlrpc_c_服务器]错误2

缺少什么?

因为您想要使用的库没有
cmake
项目,所以您需要自己处理。我建议使用
add_subdirectory
并创建一个子项目,在其中构建库(根据您的需要,可以是共享的,也可以是静态的)

此外,您需要将
cmake
指向标头的位置。尝试手动将缺少的内容添加到
add_可执行文件
或使用
include_目录
,并相应地调整您的
#include
s


您还可以使用一些非官方的
cmake
版本。如果您使用的是
git
,您可以将repo作为子模块添加,并将该repo中的代码集成到主项目中。

由于您要使用的库没有
cmake
项目,您需要自己处理。我建议使用
add_subdirectory
并创建一个子项目,在其中构建库(根据您的需要,可以是共享的,也可以是静态的)

此外,您需要将
cmake
指向标头的位置。尝试手动将缺少的内容添加到
add_可执行文件
或使用
include_目录
,并相应地调整您的
#include
s


您还可以使用一些非官方的
cmake
版本。如果您使用的是
git
,您可以将repo添加为子模块,并将该repo中的代码集成到您的主项目中。

既然您是CMake的新手,那么是否值得看一本教程


我想这会帮你解决很多困惑。

既然你是CMake的新手,也许值得看一本教程

我想这会帮你解决很多困惑。

target\u link\u目录(target PRIVATE\u lib\u dir)
target\u link\u目录(target PRIVATE\u lib\u dir)
====================[ Build | xmlrpc_c_server | Debug ]=========================
/usr/bin/cmake --build /mnt/c/Users/valentin.ackva/CLionProjects/xmlrp-c-server/cmake-build-debug --target xmlrpc_c_server -- -j 9
Scanning dependencies of target xmlrpc_c_server
[ 50%] Building CXX object CMakeFiles/xmlrpc_c_server.dir/main.cpp.o
[100%] Linking CXX executable xmlrpc_c_server
/usr/bin/ld: CMakeFiles/xmlrpc_c_server.dir/main.cpp.o: in function `main':
/mnt/c/Users/struppel/CLionProjects/xmlrp-c-server/main.cpp:31: undefined reference to `xmlrpc_c::registry::addMethod(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, xmlrpc_c::method*)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/xmlrpc_c_server.dir/build.make:84: xmlrpc_c_server] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/xmlrpc_c_server.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/xmlrpc_c_server.dir/rule] Error 2
make: *** [Makefile:118: xmlrpc_c_server] Error 2