Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Makefile和gcc构建动态共享库(.so、.dylib)_C_Gcc_Makefile - Fatal编程技术网

使用Makefile和gcc构建动态共享库(.so、.dylib)

使用Makefile和gcc构建动态共享库(.so、.dylib),c,gcc,makefile,C,Gcc,Makefile,我想用Makefile gcc构建共享库(.so.dylib)。 我的库有来自其他共享库(编译到共享库的其他C项目)的引用(符号) 我有这样的目录结构: /c/ /Project1/... /Project2/... ... /unit_tests/... /comparers/... 在我的/comparers目录中,我有这样的目录结构: 为了编译依赖于比较器共享库的单元测试共享库,我尝试了如下方法: $(SHARED_LIBRARY): assertion.o

我想用Makefile gcc构建共享库(
.so.dylib)
。 我的库有来自其他共享库(编译到共享库的其他C项目)的引用(符号)

我有这样的目录结构:

/c/
  /Project1/...
  /Project2/...
  ... 
  /unit_tests/...
  /comparers/...
在我的
/comparers
目录中,我有这样的目录结构:

为了编译依赖于比较器共享库的单元测试共享库,我尝试了如下方法:

$(SHARED_LIBRARY): assertion.o
    $(CC) $(CFLAGS) -shared -o $(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY) $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH)
其中:

COMPARERS_SHARED_LIB_PATH= ../comparers/output/debug/lib/libcomparers.so
但如果我使用静态库路径,它将无法正常编译。为什么这不起作用,以及如何使其正常工作

更新:错误消息

上面是正确构建的,但我假设它在运行时会导致错误!当我以同样的方式链接我的可执行目标时,它也会生成,但在运行时,它会给出这样的错误消息:

dyld: Library not loaded: output/debug/lib/libcomparers.so
  Referenced from: /Users/michzio/Developer/MyProjects/BachelorDegree/c/unit_tests/./output/debug/bin/unit_tests
  Reason: image not found
Abort trap: 6

尽管您没有发布错误消息,但仍有一些错误是显而易见的

一个错误是,您混合和匹配带有路径和不带路径的文件名。例如,
$(共享库)
不同于
$(输出库)/$(共享库)
断言。o
不同于
$(输出库)/assertion.o
。你需要学会如何使用它来防止这种错误

另一个错误是链接到另一个共享库的方式:运行时链接器搜索
。/comparers/output/debug/lib/libcomparers。因此
,并且该路径仅在当前目录特定时有效

而链接通常使用
LDFLAGS
,而不是
CFLAGS

一个解决方案可能是:

COMPARERS_SHARED_LIB_PATH := $(abspath ../comparers/output/debug/lib/libcomparers.so)

$(OUTPUT_LIB_DIR)/(SHARED_LIBRARY): $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH)
    $(CC) -shared -o $@ $(LDFLAGS) $^ 

但是,对于生产构建,它需要使用
$ORIGIN
相对路径为其他共享库指定
-rpath
,以便运行时链接器相对于其用户查找所需的共享库。并使用
-L-L
而不是完整路径链接到该共享库。

“它不工作”?不是很有帮助…逐字张贴错误消息。