I’m doing a Multiplatform project, and want build a .framework for iOS platform.
I have to use C++ code in the project.
My project structure:
src/commain/cpp/cinterop.def
src/iosMain/cpp/NativeIF.cpp
src/iosMain/cpp/NativeIF.h
src/iosMain/cpp/CppImplement.cpp
src/iosMain/cpp/CppImplement.h
…other cpp source code
The code in src/commain/cpp/cinterop.def:
headers = NativeIF.h
package = my.package.name
The code in src/iosMain/cpp/NativeIF.h
#ifdef __cplusplus
extern "C" {
#endif
void NativeInterface_1();
void NativeInterface_2();
#ifdef __cplusplus
}
#endif
The code in src/iosMain/cpp/NativeIF.cpp
#include "NativeIF.h"
#ifdef __cplusplus
extern "C" {
#endif
void NativeInterface_1() {
// some code of calling CppImplement.cpp
}
void NativeInterface_2() {
// some code of calling CppImplement.cpp
}
#ifdef __cplusplus
}
#endif
In my build.gradle.kts, I config the ios platform
val xcf = XCFramework(sdkName)
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64(),
).forEach {
it.binaries.framework {
baseName = "mylibname"
binaryOption("bundleId", "$bundleIdCommon.ios")
binaryOption("bundleShortVersionString", sdkVersion)
xcf.add(this)
isStatic = true
}
it.compilations.getByName("main") {
cinterops {
val infomatchingNativeLib by cinterops.creating {
defFile(project.file("src/commonMain/cpp/cinterop.def"))
compilerOpts("-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/c++/v1")
compilerOpts("-Isrc/iosMain/cpp")
compilerOpts("-Isrc/commonMain/cpp/")
...other cpp files path
}
}
}
}
The current situation is, the .framework file can be build successfully, and I can find the klib file in path of build/classes/kotlin/iosXXX/main/cinterop.
But when I import this .framework into my xcode project, and build, there will be errors:
ld: Undefined symbols:
_NativeInterface_1, referenced from:
_my_package_name_NativeInterface_1_wrapper0 in mylibname[arm64][2](mylibname.framework.o)
_NativeInterface_2, referenced from:
_my_package_name_NativeInterface_2_wrapper0 in mylibname[arm64][2](mylibname.framework.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I tried to write the implement of interface in cinterop.def directly, and wrap C++ implement with C.
But this way leads another link error in Xcode building: the C wrapper function of C++ can not be found.
What should I do to resove this problem?
Andbody can give me some advices?
Thanks very much.
PS:
- I use the .framework in a Swift project.
- I tried to use nm command to find the “NativeInterface_1” and “NativeInterface_2” in the .framework file, the result is:
U _NativeInterface_1
U _NativeInterface_2