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

311 天前
 rainboat

使用 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

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

770 次点击
所在节点    程序员
7 条回复
ingnoscemihi
311 天前
brew link gflags
clang++ test.cpp -o test
ok 啦
rainboat
311 天前
@ingnoscemihi 执行 brew link gflags 提示我“Warning: Already linked”,再次编译还是同样的问题,难顶
tangtang369
311 天前
```
#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
311 天前
@tangtang369 还真是可以编译了,大佬牛
rainboat
311 天前
@tangtang369 不过好像运行 ./test --languages="chinese,japanese,korean",输出的结果还是 english,french,german ,这个命令行设置不起作用
tangtang369
310 天前
@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
310 天前
@tangtang369 成功了,太感谢了,你真是我的哥!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/953604

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX