【问题标题】:Makefile: Select to compile against dynamic or static library programaticallyMakefile:选择以编程方式针对动态或静态库进行编译
【发布时间】:2014-06-21 21:57:11
【问题描述】:

我开发的软件需要针对外部供应商提供的库进行编译。在某些情况下,这些库可用作共享库 (libexample1.so) 或静态库 (libexample1.a)。

我希望我的 makefile 能够检测到这种情况。我的想法是检查静态库文件,如果它不存在重新定义一些编译标志。

我现在的代码是这样的:

$(PROGRAM1):$(PROGRAM1_OBJS)
ifneq ("$(wildcard $(STATIC_LIB_PATH)","")
    @echo "Compiling against static library"
else
    @echo "Compiling against dynamic library"
    STATIC_LIB_PATH = ""# SETTING IT TO EMPTY
    LDFLAGS += -lexample1 
endif
(compilation instructions)

这对我不起作用,因为它正在尝试执行 STATIC_LIB_PATH...关于如何处理这种情况的任何建议?这是最好的方法还是有更好的方法?

【问题讨论】:

    标签: c linker makefile shared-libraries static-libraries


    【解决方案1】:

    如果要设置 make 变量,则必须在配方之外进行。在配方内部,它将被解释为要执行的命令。

    在您的情况下,您可以在任何规则之前移动分配

    ifeq ("$(wildcard $(STATIC_LIB_PATH)","")
        STATIC_LIB_PATH =  # SETTING IT TO EMPTY
        LDFLAGS += -lexample1 
    endif
    
    # ...
    
    $(PROGRAM1):$(PROGRAM1_OBJS)
        (compilation instructions)
    

    通常,您不需要检查静态库和动态库。编译器和链接器已经选择了正确的库。所以,你只需要指定

    LDFLAGS += -lexample1
    

    如果可用,链接器会选择动态版本,如果只有静态库,则选择静态版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多