admin管理员组

文章数量:1392007

I'm creating a shared library plugin (Qt's plugin system) that I want to extend into Swift for Apple-native calls.

I have the compilation working with something as simple as:

plugin_dir/
    `- CMakeLists.txt
    `- plugin.cpp
    `- plugin.h
    `- plugin.swift

The CMakeLists.txt looks something like:

project_name(plugin) # etc.

# ... add swift setup

add_library(${PROJECT_NAME} SHARED project.cpp project.swift)

set_target_properties(${PROJECT_NAME} PROPERTIES Swift_MODULE_NAME "SwiftInterface")
target_compile_options(${PROJECT_NAME} PUBLIC
  "$<$<COMPILE_LANGUAGE:Swift>:-cxx-interoperability-mode=default>")

# -------------------------------------------------------------
# -- This is pulled from the swift cmake examples from apple --
# -------------------------------------------------------------
_swift_generate_cxx_header(${PROJECT_NAME}
  plugin/plugin-swift.h
  SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}")

Inside the CMakeLists.txt, I'm trying to configure the build so it produces a .dynlib that the primary C++ application can consume.

If we have something as simple as:

// project.swift
public func testSwiftCall(_ x: CInt) -> CInt {
    print("hello from swift! x=\(x)")
    return (x - 1)
}

And then a call in the .cpp file (that includes the generated swift header)

// project.cpp
#include "plugin/plugin-swift.h"

void someFunction()
{
    int x = SwiftInterface::testSwiftCall(123);
}

When I run the Xcode build, it compiles both the Swift file and the C++ source but fails at the link step.

Undefined symbols for architecture arm64:
  "SwiftInterface.testSwiftCall(Swift.Int32) -> Swift.Int32", referenced from:
      someFunction() in plugin.o
ld: symbol(s) not found for architecture arm64

I tried shifting out the .swift file(s) into a static lib and linking to the C++ shared library but it seems to have the same effect.

Update

Alas it appears to be an issue with the Xcode generator from CMake itself. If I use the Apple Provided Example, patch entrypoint of the main file, and use -G 'Xcode' instead of Ninja we hit the same issue:

Undefined symbols for architecture arm64:
  "SwiftFibonacci.fibonacciSwift(Swift.Int32) -> Swift.Int32", referenced from:
      SwiftFibonacci::fibonacciSwift(int) in libfibonacci.a[2](fibonacci-f47570677acaf48ebba84e311112b61d.o)
ld: symbol(s) not found for architecture arm64

Using nm on the resulting static lib from the interop:

fibonacci-f47570677acaf48ebba84e311112b61d.o:
0000000000000d0c s GCC_except_table37
0000000000000d1c s GCC_except_table42
0000000000000cb0 s GCC_except_table5
0000000000000ce4 s GCC_except_table6
0000000000000cf4 s GCC_except_table8
                 U _$s14SwiftFibonacci09fibonacciA0ys5Int32VADF
                 U __Unwind_Resume
0000000000000000 T __Z13fibonacci_cppi
0000000000000164 T __ZN14SwiftFibonacci14fibonacciSwiftEi
00000000000009a4 T __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longB8de180100Ev
00000000000003a8 T __ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbB8de180100Ev
0000000000000a2c T __ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstB8de180100Ev
00000000000006b4 T __ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedB8de180100Ev
0000000000000a50 T __ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getB8de180100Ev
0000000000000c20 T __ZNKSt3__15ctypeIcE5widenB8de180100Ec
                 U __ZNKSt3__16locale9use_facetERNS0_2idE
0000000000000638 T __ZNKSt3__18ios_base5flagsB8de180100Ev
0000000000000b28 T __ZNKSt3__18ios_base5rdbufB8de180100Ev
0000000000000714 T __ZNKSt3__18ios_base5widthB8de180100Ev
                 U __ZNKSt3__18ios_base6getlocEv
0000000000000650 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillB8de180100Ev
0000000000000b04 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufB8de180100Ev
0000000000000b70 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenB8de180100Ec
0000000000000b40 T __ZNSt3__111char_traitsIcE11eq_int_typeB8de180100Eii
0000000000000b68 T __ZNSt3__111char_traitsIcE3eofB8de180100Ev
0000000000000374 T __ZNSt3__111char_traitsIcE6lengthB8de180100EPKc
000000000000093c T __ZNSt3__112__to_addressB8de180100IcEEPT_S2_
0000000000000950 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerB8de180100Ev
00000000000009dc T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerB8de180100Ev
0000000000000a04 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerB8de180100Ev
00000000000007a4 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataB8de180100Ev
                 U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
0000000000000768 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1B8de180100Emc
00000000000007f8 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8de180100Emc
                 U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
00000000000000e0 T __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsB8de180100EPFRS3_S4_E
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi
0000000000000a9c T __ZNSt3__114pointer_traitsIPcE10pointer_toB8de180100ERc
000000000000072c T __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnB8de180100EPKcl
0000000000000928 T __ZNSt3__116__non_trivial_ifILb1ENS_9allocatorIcEEEC2B8de180100Ev
00000000000003c4 T __ZNSt3__116__pad_and_outputB8de180100IcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
0000000000000a64 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstB8de180100Ev
0000000000000844 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1B8de180100INS_18__default_init_tagESA_EEOT_OT0_
0000000000000880 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2B8de180100INS_18__default_init_tagESA_EEOT_OT0_
0000000000000c8c T __ZNSt3__118__constexpr_strlenB8de180100EPKc
0000000000000604 T __ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1B8de180100ERNS_13basic_ostreamIcS2_EE
0000000000000ab0 T __ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2B8de180100ERNS_13basic_ostreamIcS2_EE
0000000000000a88 T __ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getB8de180100Ev
00000000000008bc T __ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2B8de180100ENS_18__default_init_tagE
00000000000008d0 T __ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2B8de180100ENS_18__default_init_tagE
0000000000000188 T __ZNSt3__124__put_character_sequenceB8de180100IcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
                 U __ZNSt3__14coutE
000000000000010c T __ZNSt3__14endlB8de180100IcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
                 U __ZNSt3__15ctypeIcE2idE
                 U __ZNSt3__16localeD1Ev
                 U __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
                 U __ZNSt3__18ios_base5clearEj
00000000000007cc T __ZNSt3__18ios_base5widthB8de180100El
0000000000000c58 T __ZNSt3__18ios_base8setstateB8de180100Ej
00000000000008fc T __ZNSt3__19allocatorIcEC2B8de180100Ev
00000000000006d8 T __ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateB8de180100Ej
0000000000000bf4 T __ZNSt3__19use_facetB8de180100INS_5ctypeIcEEEERKT_RKNS_6localeE
0000000000000098 T __ZNSt3__1lsB8de180100INS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
                 U __ZSt9terminatev
0000000000000704 T ___clang_call_terminate
                 U ___cxa_begin_catch
                 U ___cxa_end_catch
                 U ___gxx_personality_v0
                 U _strlen
0000000000000d2c s l_.str
0000000000000000 t ltmp0
0000000000000cb0 s ltmp1
0000000000000d2c s ltmp2
0000000000015eb0 s ltmp3


fibonacci-99a69f7c10ab17ebf62cc45081767ee2.o:
0000000000000318 s GCC_except_table0
0000000000000000 T _$s9fibonacci0A5Swiftys5Int32VADF
                 U _$sSS19stringInterpolationSSs013DefaultStringB0V_tcfC
                 U _$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
                 U _$sSSN
000000000000030c T _$sSa12_endMutationyyF
                 U _$sSaMa
                 U _$ss26DefaultStringInterpolationV06appendC0yyxs06CustomB11ConvertibleRzlF
                 U _$ss26DefaultStringInterpolationV13appendLiteralyySSF
                 U _$ss26DefaultStringInterpolationV15literalCapacity18interpolationCountABSi_SitcfC
000000000000024c T _$ss26DefaultStringInterpolationVWOh
                 U _$ss27_allocateUninitializedArrayySayxG_BptBwlF
0000000000000274 T _$ss27_finalizeUninitializedArrayySayxGABnlF
                 U _$ss5Int32VN
                 U _$ss5Int32Vs23CustomStringConvertiblesWP
                 U _$ss5print_9separator10terminatoryypd_S2StF
00000000000002b4 T _$ss5print_9separator10terminatoryypd_S2StFfA0_
00000000000002e0 T _$ss5print_9separator10terminatoryypd_S2StFfA1_
                 U _$sypN
                 U __Z13fibonacci_cppi
                 U ___gxx_personality_v0
0000000000000346 S ___swift_reflection_version
                 U _swift_bridgeObjectRelease
                 U _swift_bridgeObjectRetain
0000000000000340 s l_.str.0.
0000000000000341 s l_.str.1.


0000000000000343 s l_.str.1. 
0000000000000334 s l_.str.11.x [swift]: 
0000000000000348 s l_llvm.swift_module_hash
0000000000000000 t ltmp0
0000000000000318 s ltmp1
0000000000000334 s ltmp2
0000000000000346 s ltmp3
0000000000000348 s ltmp4
0000000000000358 s ltmp5
0000000000001418 s ltmp6
00000000000014d8 s ltmp7

Ninja Works

However, if we use Ninja as the generator. Things go as planned and the interop succeeds. This aligns more with issues others have raised

fibonacci.swift.o:
0000000000000318 s GCC_except_table0
0000000000000000 T _$s14SwiftFibonacci09fibonacciA0ys5Int32VADF
                 U _$sSS19stringInterpolationSSs013DefaultStringB0V_tcfC
                 U _$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
                 U _$sSSN
000000000000030c T _$sSa12_endMutationyyF
                 U _$sSaMa
                 U _$ss26DefaultStringInterpolationV06appendC0yyxs06CustomB11ConvertibleRzlF
                 U _$ss26DefaultStringInterpolationV13appendLiteralyySSF
                 U _$ss26DefaultStringInterpolationV15literalCapacity18interpolationCountABSi_SitcfC
000000000000024c T _$ss26DefaultStringInterpolationVWOh
                 U _$ss27_allocateUninitializedArrayySayxG_BptBwlF
0000000000000274 T _$ss27_finalizeUninitializedArrayySayxGABnlF
                 U _$ss5Int32VN
                 U _$ss5Int32Vs23CustomStringConvertiblesWP
                 U _$ss5print_9separator10terminatoryypd_S2StF
00000000000002b4 T _$ss5print_9separator10terminatoryypd_S2StFfA0_
00000000000002e0 T _$ss5print_9separator10terminatoryypd_S2StFfA1_
                 U _$sypN
                 U __Z13fibonacci_cppi
0000000000000346 S ___swift_reflection_version
                 U __swift_exceptionPersonality
                 U _swift_bridgeObjectRelease
                 U _swift_bridgeObjectRetain
0000000000000340 s l_.str.0.
0000000000000341 s l_.str.1.


0000000000000343 s l_.str.1. 
0000000000000334 s l_.str.11.x [swift]: 
0000000000000348 s l_llvm.swift_module_hash
0000000000000000 t ltmp0
0000000000000318 s ltmp1
0000000000000334 s ltmp2
0000000000000346 s ltmp3
0000000000000348 s ltmp4
0000000000000358 s ltmp5
0000000000000360 s ltmp6
0000000000000400 s ltmp7


fibonacci.cpp.o:
0000000000000d0c s GCC_except_table37
0000000000000d1c s GCC_except_table42
0000000000000cb0 s GCC_except_table5
0000000000000ce4 s GCC_except_table6
0000000000000cf4 s GCC_except_table8
                 U _$s14SwiftFibonacci09fibonacciA0ys5Int32VADF
                 U __Unwind_Resume
0000000000000000 T __Z13fibonacci_cppi
0000000000000164 T __ZN14SwiftFibonacci14fibonacciSwiftEi
00000000000009a4 T __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longB8ne180100Ev
00000000000003a8 T __ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbB8ne180100Ev
0000000000000a2c T __ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstB8ne180100Ev
00000000000006b4 T __ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedB8ne180100Ev
0000000000000a50 T __ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getB8ne180100Ev
0000000000000c20 T __ZNKSt3__15ctypeIcE5widenB8ne180100Ec
                 U __ZNKSt3__16locale9use_facetERNS0_2idE
0000000000000638 T __ZNKSt3__18ios_base5flagsB8ne180100Ev
0000000000000b28 T __ZNKSt3__18ios_base5rdbufB8ne180100Ev
0000000000000714 T __ZNKSt3__18ios_base5widthB8ne180100Ev
                 U __ZNKSt3__18ios_base6getlocEv
0000000000000650 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillB8ne180100Ev
0000000000000b04 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufB8ne180100Ev
0000000000000b70 T __ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenB8ne180100Ec
0000000000000b40 T __ZNSt3__111char_traitsIcE11eq_int_typeB8ne180100Eii
0000000000000b68 T __ZNSt3__111char_traitsIcE3eofB8ne180100Ev
0000000000000374 T __ZNSt3__111char_traitsIcE6lengthB8ne180100EPKc
000000000000093c T __ZNSt3__112__to_addressB8ne180100IcEEPT_S2_
0000000000000950 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerB8ne180100Ev
00000000000009dc T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerB8ne180100Ev
0000000000000a04 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerB8ne180100Ev
00000000000007a4 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataB8ne180100Ev
                 U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
0000000000000768 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1B8ne180100Emc
00000000000007f8 T __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8ne180100Emc
                 U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
00000000000000e0 T __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsB8ne180100EPFRS3_S4_E
                 U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi
0000000000000a9c T __ZNSt3__114pointer_traitsIPcE10pointer_toB8ne180100ERc
000000000000072c T __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnB8ne180100EPKcl
0000000000000928 T __ZNSt3__116__non_trivial_ifILb1ENS_9allocatorIcEEEC2B8ne180100Ev
00000000000003c4 T __ZNSt3__116__pad_and_outputB8ne180100IcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
0000000000000a64 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstB8ne180100Ev
0000000000000844 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1B8ne180100INS_18__default_init_tagESA_EEOT_OT0_
0000000000000880 T __ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2B8ne180100INS_18__default_init_tagESA_EEOT_OT0_
0000000000000c8c T __ZNSt3__118__constexpr_strlenB8ne180100EPKc
0000000000000604 T __ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1B8ne180100ERNS_13basic_ostreamIcS2_EE
0000000000000ab0 T __ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2B8ne180100ERNS_13basic_ostreamIcS2_EE
0000000000000a88 T __ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getB8ne180100Ev
00000000000008bc T __ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2B8ne180100ENS_18__default_init_tagE
00000000000008d0 T __ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2B8ne180100ENS_18__default_init_tagE
0000000000000188 T __ZNSt3__124__put_character_sequenceB8ne180100IcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
                 U __ZNSt3__14coutE
000000000000010c T __ZNSt3__14endlB8ne180100IcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
                 U __ZNSt3__15ctypeIcE2idE
                 U __ZNSt3__16localeD1Ev
                 U __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
                 U __ZNSt3__18ios_base5clearEj
00000000000007cc T __ZNSt3__18ios_base5widthB8ne180100El
0000000000000c58 T __ZNSt3__18ios_base8setstateB8ne180100Ej
00000000000008fc T __ZNSt3__19allocatorIcEC2B8ne180100Ev
00000000000006d8 T __ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateB8ne180100Ej
0000000000000bf4 T __ZNSt3__19use_facetB8ne180100INS_5ctypeIcEEEERKT_RKNS_6localeE
0000000000000098 T __ZNSt3__1lsB8ne180100INS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
                 U __ZSt9terminatev
0000000000000704 T ___clang_call_terminate
                 U ___cxa_begin_catch
                 U ___cxa_end_catch
                 U ___gxx_personality_v0
                 U _strlen
0000000000000d2c s l_.str
0000000000000000 t ltmp0
0000000000000cb0 s ltmp1
0000000000000d2c s ltmp2

So, we see that Xcode is mangling the names of the .o files and the addresses are slightly different. My lack of knowledge means I'm missing why that would matter in the context of symbol translation when the names of the symbols are otherwise identical.

本文标签: CMake use Swift in C shared library (plugin)Stack Overflow