使用 CMake 编译项目

问题描述

我的项目结构是这样的。

build
  - folder where cmake outputs the solution file

client
  - client.c
  - CMakeLists.txt

server
  - server.c
  - CMakeLists.txt

open62541
  - open62541.c
  - open62541.h
  - CMakeLists.txt

CMakeLists.txt

主要的CMakeLists.txt有以下代码

cmake_minimum_required(VERSION 3.0)
project(openstack)
add_subdirectory(open62541)
add_subdirectory(server)

open62541/CMakeLists.txt 有如下代码

project(Lib1)
add_library(lib1 open62541.c open62541.h)

和 server/CMakeLists.txt 看起来像这样

   project(App)

   add_executable(app server.c)

   include_directories(${Lib1_SOURCE_DIR})

   target_link_libraries(app PRIVATE lib1 ws2_32 wsock32)

server.c 有以下代码。

#include "open62541.h"
#include "signal.h"
#include <stdlib.h>
#include "stdio.h"

static volatile UA_Boolean running = true;
static void stopHandler(int sig) {
    UA_LOG_INFO(UA_Log_Stdout,UA_LOGCATEGORY_USERLAND,"received ctrl-c");
    running = false;
}

int main(void) {
    signal(SIGINT,stopHandler);
    signal(SIGTERM,stopHandler);

    UA_Server *server = UA_Server_new();
    UA_ServerConfig_setDefault(UA_Server_getConfig(server));

    UA_StatusCode retval = UA_Server_run(server,&running);

    UA_Server_delete(server);
    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}

server.c 需要在 open62541.c 和 open62541.h 中定义和声明的函数。(我现在还没有构建客户端项目)所以,我在 server.c 文件和服务器中包含了 open62541.h /CMakeLists.txt,如您所见,我已提供指向 open62541 文件夹的链接。我在 Visual Studio 中收到以下链接器错误。这条消息是用德语写的,对此表示抱歉。

    Erstellen gestartet...
1>------ Erstellen gestartet: Projekt: app,Konfiguration: Debug x64 ------
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_Server_delete" in Funktion "main".
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_Server_getConfig" in Funktion "main".
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_Server_run" in Funktion "main".
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_Server_new" in Funktion "main".
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_ServerConfig_setMinimalCustomBuffer" in Funktion "UA_ServerConfig_setMinimal".
1>server.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_UA_Log_Stdout" in Funktion "stopHandler".
1>C:\Users\acer\CMake_Project\build\server\Debug\app.exe : fatal error LNK1120: 6 nicht aufgelöste Externe
1>Die Erstellung des Projekts "app.vcxproj" ist abgeschlossen -- FEHLER.
2>------ Erstellen übersprungen: Projekt: ALL_BUILD,Konfiguration: Debug x64 ------
2>Für diese Projektmappenkonfiguration wurde kein zu erstellendes Projekt ausgewählt. 
========== Erstellen: 0 erfolgreich,1 fehlerhaft,2 aktuell,1 übersprungen ==========

当我包含服务器时,项目构建良好。 c,open62541.c,open62541.h 文件在单个文件夹中,并使用这样的单个 CMakeLists.txt 文件。

cmake_minimum_required(VERSION 3.0)

project(openstack)

set(SOURCES server.c open62541.c open62541.h)

add_executable(openstack ${SOURCES})

target_link_libraries(openstack PRIVATE ws2_32 wsock32)

但是,当我尝试在不同文件夹中构建我的项目时出现错误。我该如何解决这些错误?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)