在 Mac 上将 Mono 链接到 C++ 项目时出现链接器错误

问题描述 投票:0回答:0

我正在使用 CMake 将 Mono 链接到我的 Mac C++ 项目中,我已经完成了大部分工作。这是我的 CMakeLists:

cmake_minimum_required(VERSION 3.26.3)

project(IgnisEngine VERSION 0.1
                    DESCRIPTION "Game engine"
                    LANGUAGES C)
add_executable(${PROJECT_NAME} src/monoTest.c)

find_package(PkgConfig REQUIRED)
set(ENV{PKG_CONFIG_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/libraries/MacOS/Mono.framework/Versions/Current/lib/pkgconfig")
pkg_check_modules(MONO REQUIRED mono-2)
target_include_directories(${PROJECT_NAME} PRIVATE ${MONO_INCLUDE_DIRS})
target_link_directories(${PROJECT_NAME} PRIVATE ${MONO_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${MONO_LIBRARIES})

target_compile_options(${PROJECT_NAME} PRIVATE ${MONO_CFLAGS}) # This and following line shouldn't be necessary
target_link_options(${PROJECT_NAME} PRIVATE ${MONO_STATIC_LDFLAGS})

include(CMakePrintHelpers)
cmake_print_variables(MONO_INCLUDE_DIRS MONO_LIBRARY_DIRS MONO_LIBRARIES MONO_CFLAGS MONO_STATIC_LDFLAGS)

我将 PKG_CONFIG_PATH 设置为 Mono 框架中具有 mono-2.pc 的目录。 我之前没有将 PkgConfig 与 CMake 一起使用,但这似乎工作正常,因为这是它在输出控制台中由此定义的变量:

MONO_INCLUDE_DIRS="/Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/Current/lib/pkgconfig/../../include/mono-2.0" ; 
MONO_LIBRARY_DIRS="/Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/Current/lib/pkgconfig/../../lib" ; 
MONO_LIBRARIES="mono-2.0;iconv;pthread" ; 

编译器和链接器标志看起来也很不错(尽管我对此没有太多经验):

MONO_CFLAGS="-D_THREAD_SAFE;-I/Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/Current/lib/pkgconfig/../../include/mono-2.0" ; 
MONO_STATIC_LDFLAGS="-L/Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/Current/lib/pkgconfig/../../lib;-lmono-2.0;-liconv;-lpthread"

这是 monoTest.c:

#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>

int main( int argc, char* args[] ) {
    MonoDomain *domain;

    domain = mono_jit_init ("test.cs");
}

jit.h 的完整路径是:

/Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Headers/mono-2.0/mono/jit/jit.h

这好像和上面的MONO_INCLUDE_DIRS是一致的

目前这一切都可以编译并制作得很好,所以在编译器方面我们很好。现在的问题是在链接器方面,因为当我运行时出现以下错误:

[build] ld: warning: ignoring file /Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/6.12.0/lib/libmono-2.0.dylib, file is universal (i386,x86_64) but does not contain the arm64 architecture: /Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Versions/6.12.0/lib/libmono-2.0.dylib
[build] Undefined symbols for architecture arm64:
[build]   "_mono_jit_init", referenced from:
[build]       _main in monoTest.c.o
[build] ld: symbol(s) not found for architecture arm64

这是我要解决的错误。我在这里有几个问题:

  1. CMake怎么知道是动态链接还是静态链接?我希望 CMake 静态链接到 /Users/mickey/Documents/GitHub/IgnisEngine/libraries/MacOS/Mono.framework/Libraries/libmono-2.0.a ,尽管我不确定如何指定它。

  2. 上面关于忽略 libmono-2.0.dylib 的警告是它不起作用的原因吗?如果链接器在那里寻找函数定义,那么这将解释错误,但我不确定为什么它首先发生。

我已经通过

nm libmono-2.0.dylib | grep mono_jit_init
验证 libmono-2.0.a 和 libmono-2.0.dylib 都包含为 _mono_jit_init 定义的符号。我将不胜感激任何帮助,谢谢。

编辑:一些额外的信息:monoTest.c 最初是 monoTest.cpp,但我切换到 C,因为我认为链接器问题可能是由于名称修改造成的。但这似乎并没有解决问题。

c++ macos cmake mono
© www.soinside.com 2019 - 2024. All rights reserved.