V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rainboat
V2EX  ?  程序员

在 MacOS 上 C++编译链接的一个问题

  •  
  •   rainboat · 300 天前 · 754 次点击
    这是一个创建于 300 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    使用 gflags 库,编译不通过

    最近项目里面要用 gflags 库,然后通过brew install gflags安装 gflags ,但是一通折腾就是编译不通过,不知道大伙有没有见过这样的问题,下面是编译不通过的代码

    编译不通过的代码

    #include <gflags/gflags.h>
    #include <iostream>
    
    DECLARE_string(test);
    
    int main(int argc, char* argv[]) {
        std::cout << FLAGS_test << std::endl;
        return 0;
    }
    

    编译错误

    Undefined symbols for architecture x86_64:
      "fLS::FLAGS_test", referenced from:
          _main in test-d79d53.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    已经尝试过的编译命令

    下面是我尝试过的几个不同的编译命令,均无效:

    g++ test.cpp -lgflags
    g++ test.cpp /usr/local/lib/libgflags.dylib 
    g++  -L /usr/local/Cellar/gflags/2.2.2/lib -lgflags test.cpp 
    

    目前分析了一下,通过通过brew install gflags安装的 gflags ,只提供了 dylib 动态链接库,如下所示:

    [/usr/local/Cellar/gflags/2.2.2/lib]$ ls
    cmake                           libgflags.2.2.dylib             libgflags_nothreads.2.2.2.dylib libgflags_nothreads.dylib
    libgflags.2.2.2.dylib           libgflags.dylib                 libgflags_nothreads.2.2.dylib   pkgconfig
    
    [/usr/local/lib]$ ls | grep gflags
    libgflags.2.2.2.dylib
    libgflags.2.2.dylib
    libgflags.dylib
    libgflags_nothreads.2.2.2.dylib
    libgflags_nothreads.2.2.dylib
    libgflags_nothreads.dylib
    

    是否使用动态链接库需要指定某些额外的选项,大家有类似的经验吗?

    7 条回复  ?  2023-07-04 10:59:06 +08:00
    ingnoscemihi
        1
    ingnoscemihi  
       300 天前
    brew link gflags
    clang++ test.cpp -o test
    ok 啦
    rainboat
        2
    rainboat  
    OP
       300 天前
    @ingnoscemihi 执行 brew link gflags 提示我“Warning: Already linked”,再次编译还是同样的问题,难顶
    tangtang369
        3
    tangtang369  
       300 天前
    ```
    #include <iostream>
    #include <gflags/gflags.h>

    //DECLARE_string(test);
    DEFINE_string(languages, "english,french,german","comma-separated list of languages to offer in the 'lang' menu");
    int main(int argc, char* argv[]) {
    std::cout << FLAGS_languages << std::endl;

    return 0;
    }
    ```
    用 DEFINE_string 可以编译通过
    rainboat
        4
    rainboat  
    OP
       300 天前
    @tangtang369 还真是可以编译了,大佬牛
    rainboat
        5
    rainboat  
    OP
       300 天前
    @tangtang369 不过好像运行 ./test --languages="chinese,japanese,korean",输出的结果还是 english,french,german ,这个命令行设置不起作用
    tangtang369
        6
    tangtang369  
       300 天前   ?? 1
    @rainboat 要解析输入
    ```
    #include <iostream>
    #include <gflags/gflags.h>

    //DECLARE_string(test);
    DEFINE_string(languages, "english,french,german","comma-separated list of languages to offer in the 'lang' menu");
    int main(int argc, char* argv[]) {
    gflags::ParseCommandLineFlags(&argc, &argv, true);

    std::cout << FLAGS_languages << std::endl;

    return 0;
    }
    ```
    rainboat
        7
    rainboat  
    OP
       299 天前
    @tangtang369 成功了,太感谢了,你真是我的哥!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5898 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:15 · PVG 10:15 · LAX 19:15 · JFK 22:15
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com