我有两个文件:
lib.c
#include<stdio.h>
void hi() {
printf("Hi i'm a library function in lib.so\n");
}
和主。c
#include<stdio.h>
#include<dlfcn.h>
/* based on Jeff Scudder's code */
int main() {
void *SharedObjectFile;
void (*hi)();
// Load the shared libary;
Shar
dotnet运行错误定义了。我正在尝试通过C库DllImport在C#和.Net核心x64 Linux中运行汇编代码。如何正确地做到这一点?
C#:
using System.Runtime.InteropServices;
class Program{
[DllImport("lib.so")] public static extern int foo ();
static void Main(string[] args)
{
int code = foo();
System.Console.WriteLine(code);
我编写了一段代码,它由一个动态库(lib.c)和一个主可执行文件(main.c)组成。在这两个文件中,我定义了一个名为:int global的全局变量。不太聪明但这不是问题。
在编译动态库时,-fPIC选项似乎是强制性的:
gcc lib.c -fPIC -shared -o lib.so
否则我会得到:
/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
当
此代码在linux下编译,但在mac下编译( lib.c的内容如下所示):
int add(int a, int b);
int sum(int a, int b) {return add(a, b);}
在linux中,我使用这个命令,它可以工作:
gcc -shared -fPIC lib.c -o lib.so
相同的命令在mac中失败,从而产生以下错误:
架构x86_64的未定义符号:
"_add",引用自:
ccK5mZfC.o中的_sum
ld:在体系结构x86_64中找不到符号
collect2: ld返回1个退出状态
请您给我一个gcc选项或一个选项,签
我有两个版本的第三方C++库(lib.so和头文件)在一个版本中,所有的类/枚举/结构都在名称空间"A“中,在另一个版本中,它们在名称空间"B”中。两个版本的头文件和lib.so名称都是相同的 我怎样才能拥有相同的代码库,这样我才能同时支持两个版本。像这样的东西 if (myVersion == "1.0") {
/* pick all the symbols from namespace "A"*/
} else {
/* pick all the symbols from namespace "B"*/
}