gpt4 book ai didi

c++ - 将共享库相互链接共享库 C++

转载 作者:太空狗 更新时间:2023-10-29 23:16:10 26 4
gpt4 key购买 nike

我已成功创建共享库 libA.so
里面的所有类,都有 namspace common::A

ldd libA.so
linux-vdso.so.1 => (0x00007fffd632d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6497d19000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6497b03000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6497743000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6497447000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6498243000)

然后,我需要创建另一个使用 A 的库 B。因此我链接它(-lA 和 -L< path_to_A >)并使用 _I/进行编译。里面的所有类,都有 namspace common::B

编译生成libB.so,但是:

1) Elipse 在我调用 A 方法的代码中放置红色 X:

 Multiple markers at this line
- Symbol '<A_method>' could not be resolved
- Function '<A_method>' could not be resolved

2) 图书馆 A 似乎没有链接到 B:

ldd libB.so
linux-vdso.so.1 => (0x00007fffbcbfe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f695ca59000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f695c842000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f695c483000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f695bf7e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f695d1d9000)

我不明白为什么我没有指向 A 的链接:

libA.so => .....

有什么想法吗?

更新

这是 makefile(由 eclipse 自动生成):

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include src/network/mqtt/subdir.mk
-include src/data/subdir.mk
-include subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables

# All Target
all: libB.so

# Tool invocations
libB.so: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: GCC C++ Linker'
g++ -L/path_where_is_A_so/ -shared -o "libB.so" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '

# Other Targets
clean:
-$(RM) $(LIBRARIES)$(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(OBJS)$(CPP_DEPS)$(C_DEPS) libB.so
-@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

最佳答案

如果您的 libB 不使用 libA 中的任何内容,链接器可能会放弃与 libA 的链接(取决于链接器标志 --as-needed 是否是您工具链中的默认值。)

要强制 libB 链接到 libA,指定标志 -Wl,--no-as-needed 出现在 -lA 之前。

关于c++ - 将共享库相互链接共享库 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com