c –使用CMake链接到Windows上的静态库时遇到麻烦

电脑杂谈  发布时间:2020-07-16 22:18:32  来源:网络整理

cmake 静态库_linux boost 静态库_gcc 引用静态库

LS,

我正在尝试建立可用于动态和静态链接的静态和动态库. 无论我使用什么编译器,我都希望该库能在尽可能多的平台上运行. 为了构建库和一些测试程序cmake 静态库,我分别使用CMake在Windows和Windows上分别使用g和MSVC来构建库eeg.

在Linux上,动态库和静态库似乎在Windows上都能正常工作. dll似乎可以完美链接,并且我的测试程序可以运行. 但是,使用静态库的程序将抱怨链接错误. 我真的很想念我做错了什么,它可能是我的CMakeLists.txt的内容,或者可能是我的库的安装程序.

下面,我制作了一个使用我的库的最小程序,该程序演示了我遇到的问题. 该库包含两个C文件,一个用于导出C文件中的代码的C API,一个使用C API C程序(最后一个CMakeList.txt),它可以构建除使用静态库的程序以外的所有程序. 所有这些都产生了一个美妙的“世界,你好!”.

linux boost 静态库_cmake 静态库_gcc 引用静态库

我知道我展示了很多代码,但是至少这是一个最小的项目cmake 静态库,它演示了链接到静态库的问题. 我希望有人可以看一下这个项目并向我解释我做错了什么. <

伴奏问候

hetepeperfan

C文件PriCpp.cpp

linux boost 静态库_cmake 静态库_gcc 引用静态库

#include "PriCpp.h"
using namespace std;
string PriMessageBuilder::message() const {
    return "Hello, World!";
}

标题PriCpp.h

#ifndef PRICPP_H
#define PRICPP_H
#include <string>
class PriMessageBuilder{
public:
    std::string message() const;
};
#endif

C API是:

cmake 静态库_gcc 引用静态库_linux boost 静态库

mycapi.h

#ifndef MYCAPI_H
#define MYCAPI_H
#include "builder_export.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {} message_builder;
BUILDER_EXPORT message_builder* message_builder_new();
BUILDER_EXPORT void             message_builder_destroy(
                                        message_builder* builder
                                        );
BUILDER_EXPORT char*            message_builder_message(
                                        message_builder* builder
                                        );
#ifdef __cplusplus
}
#endif
#endif

mycapi.cpp是:

#include "mycapi.h"
#include "PriCpp.h"
#include <cstring>
#include <cstdlib>
message_builder* message_builder_new() {
    PriMessageBuilder* ret = NULL;
    try {
        ret = new PriMessageBuilder();
    } catch (...) {
    }
    return reinterpret_cast<message_builder*>(ret);
}
void message_builder_destroy(message_builder* builder)
{
    PriMessageBuilder* b = reinterpret_cast<PriMessageBuilder*>(builder);
    delete b;
}
char* message_builder_message(message_builder* builder)
{
    PriMessageBuilder* b = reinterpret_cast<PriMessageBuilder*>(builder);
    return strdup(b->message().c_str());
}

gcc 引用静态库_linux boost 静态库_cmake 静态库

我与上述库结合使用的程序.

program.cpp

#include <iostream>
#include <cstdlib>
#include <string>
#include "mycapi.h"
using namespace std;
class MessageBuilder {
public:
    MessageBuilder() : m_builder(message_builder_new()) {
    }
    ~MessageBuilder() {
        message_builder_destroy(m_builder);
    }
    string MessageBuilder::message() {
        char* msg = message_builder_message(m_builder);
        string m(msg);
        free (msg);
        return m;
    }
private:
    message_builder* m_builder;
};
int main(int, char**) {
    MessageBuilder m;
    cout << m.message() << endl;
    return 0;
}

最后,使用CMakeLists.txt构建Makefile或Visual Studio解决方案

#setting up project
cmake_minimum_required(VERSION 2.6)
project(libbuilder CXX) 
include (GenerateExportHeader)
include_directories("${PROJECT_BINARY_DIR}")
#creating library
add_library(builder SHARED PriCpp.cpp PriCpp.h mycapi.cpp mycapi.h)
add_library(builder-static STATIC PriCpp.cpp PriCpp.h mycapi.cpp mycapi.h)
generate_export_header(builder)
set_target_properties(builder PROPERTIES COMPILE_FLAGS -DBUILD_BUILDER_SHARED)
set_target_properties(builder-static PROPERTIES COMPILE_FLAGS -DBUILDER_STATIC_DEFINE)
#creating programs
add_executable(program program.cpp)
add_executable(program-static program.cpp)
target_link_libraries(program builder)
target_link_libraries(program-static builder-static)

如果构建解决方案,则会收到以下链接器错误:

1>program.obj : error LNK2019: unresolved external symbol __imp__message_builder_new referenced in function "public: __thiscall MessageBuilder::MessageBuilder(void)" (??0MessageBuilder@@QAE@XZ)
1>program.obj : error LNK2019: unresolved external symbol __imp__message_builder_destroy referenced in function "public: __thiscall MessageBuilder::~MessageBuilder(void)" (??1MessageBuilder@@QAE@XZ)
1>program.obj : error LNK2019: unresolved external symbol __imp__message_builder_message referenced in function "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall MessageBuilder::message(void)" (?message@MessageBuilder@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>K:\duijn119\programming\cmake\staticsharedlib\build\Debug\program-static.exe : fatal error LNK1120: 3 unresolved externals

CMake生成的include头是:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-282828-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...