我目前正在尝试让可执行文件与它需要的所有依赖项正确链接。
这是依赖项的示例结构:
exe -> libA -> libB
Run Code Online (Sandbox Code Playgroud)
exe并libA拥有自己的存储库。exe拉入libA这样的东西:
add_executable(exe ${sources})
ExternalProject_Add(
libA
GIT_REPOSITORY http://some/git/url/libA.git
...
)
target_include_directories(exe PRIVATE ${libA_includes})
target_link_libraries(exe ${libA_libs}/libA.a)
add_dependencies(exe libA)
Run Code Online (Sandbox Code Playgroud)
libAlibB以类似的方式拉入:
add_library(libA STATIC ${sources})
ExternalProject_Add(
libB
URL http://some/artifact/repo/libB.tgz
...
)
target_include_directories(libA PRIVATE ${libB_includes})
target_link_libraries(libA ${libB_libs}/libB.a)
add_dependencies(libA libB)
Run Code Online (Sandbox Code Playgroud)
我可以libA很好地构建,以及正确链接到libB. 但是,当我尝试构建时exe,它只链接到libA而不是libB. 我怎样才能让 CMake 知道之间的依赖libA和libB不应该通过 ExternalProject 丢失?
编辑:
我创建了一些依赖关系图,希望能阐明我想要的:
实际的:

我的期望:

任何帮助将不胜感激。谢谢。
编辑2:
我最终使用以下作为解决方案:
在 libA 的 …
我在asyncio事件循环中遇到了一些CPU密集型任务的问题.我在处理维护传入数据缓冲区和从中构建数据包时遇到的麻烦.我已经尝试使用执行程序来执行CPU绑定的东西,但是当从中删除数据包时,无法维护缓冲区的顺序.
我正在寻找一种最佳实践方法来实现以下功能,而无需在事件循环中执行CPU绑定任务.
import asyncio
import struct
class Reader(asyncio.Protocol):
def __init__(self):
self.extra = bytearray()
def data_received(self, data):
self.extra.extend(data)
packet = get_packet(bytes(self.extra))
if packet:
del self.extra[:len(packet)]
if verify_hash(packet): # CPU intensive
asyncio.async(distribute(packet)) # Some asyncio fan-out callback
def get_packet(data): # CPU intensive
if len(data) > HEADER_SIZE:
payload_size, = struct.unpack_from(HEADER_FORMAT, data)
if len(data) >= HEADER_SIZE + payload_size:
return data[:HEADER_SIZE + payload_size]
return None
loop = asyncio.get_event_loop()
loop.run_until_complete(loop.create_server(Reader, '0.0.0.0', 8000))
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)