我有一个包含 5 个项目的 Visual Studio 解决方案
主要取决于A,B。 A 依赖于 C,D。
我对构建过程的理解很脆弱。
库单独构建良好,尤其是 A;我不觉得我在将 C 和 D 链接到 A。
为了构建 Main 应用程序,我必须将 A、B、C 和 D 作为输入库,即使 Main 仅直接依赖于 A、B。
现在我正尝试在 Linux 上使用 CMake 构建整个东西,我发现自己再次接触到这些链接。这次我不想使用蛮力,而是更愿意了解它是如何链接在一起的。
我是否应该将 A、B、C 和 D 构建为 .a 静态库并让 Main 包含它们?
如果没有来自 C 和 D 的符号,A 怎么可能构建?
最佳答案
静态库仅仅是包含目标文件的文件(即单独编译的源文件)。因此,在构建静态库时,您不会“链接”它,而是“归档”它。
链接可执行文件或共享库时必须解析符号。此时链接器会尝试解析所有符号,如果不能解析,则会出现 undefined reference 错误。但是,这又与链接有关。静态库不需要在其中定义所有符号。
在您的情况下,如果 A、B、C 和 D 是静态库,它们将是彼此独立 build 。从 C 和 D 构建 A 所需的唯一东西是编译器需要的头文件。
当您构建可执行文件时,您需要指定所有静态库,即使 Main 没有“直接”引用来自 C 或 D 的符号。
现在,即使静态库不能隐式依赖于其他库,CMake 也提供了一种在构建系统级别表达这种依赖性的方法。您可以执行以下操作
add_library(C STATIC ${B_SOURCES})
add_library(D STATIC ${D_SOURCES})
add_library(A STATIC ${A_SOURCES})
target_link_libraries(A PUBLIC C D)
上面的 target_link_libraries 命令不会导致 A 与 C 和 D 链接 - 如我所写,那没有静态库工作。相反,它通知 CMake 在将可执行文件与 A 链接时,它还必须将其与 C 和 D 链接:
add_executable(Main ${MAIN_SOURCES})
target_link_libraries(Main PRIVATE A)
即使 target_link_libraries 只包含 A,CMake 生成的 Makefile 也会链接 C 和 D - 因为它们被指定为 A 的依赖项。
dllexport 和 dllimport
这两个属性仅适用于共享库 (DLL)。它们控制从 DLL 导出哪些符号(即可以从链接到该 DLL 的可执行文件访问)。 Here's a link描述 Linux 上的想法和等效内容。
关于C++ 构建过程 - lib 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50611405/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm
有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“