编写支持 `--static` 的 pkg-config 文件
writing a pkg-config file that supports `--static`
我想提供一个(另外)支持静态 linking 的 pkg-config 文件。
通常你可以用这样的东西来做到这一点:
Libs: -L${libdir} -lfoo
Libs.private: -L${libdir} -lbar
Cflags: -I${includedir} -DFOO
这将产生:
$ pkg-config --cflags foo
-I/usr/local/include -DFOO
$ pkg-config --libs foo
-L/usr/local/lib -lfoo
$ pkg-config --static --cflags foo
-I/usr/local/include -DFOO
$ pkg-config --static --libs foo
-L/usr/local/lib -lfoo -lbar
不幸的是,我的库 foo 需要在 linking dynamically/statically 和 link 时使用不同的预处理器定义不同版本的库。
所以期望的输出是:
$ pkg-config --cflags foo
-I/usr/local/include -DFOO_DYNAMIC
$ pkg-config --libs foo
-L/usr/local/lib -lfoo
$ pkg-config --static --cflags foo
-I/usr/local/include -DFOO_STATIC
$ pkg-config --static --libs foo
-L/usr/local/lib -lfoo_static
所以问题是:
- 是否可以为
static
变体提供 不同的 CFLAGS/LIBS 而不仅仅是 在顶部添加 动态变体的?
简答:否
解决方法是提供一个不同的 .pc 文件,命名为 foo-static.pc 或类似名称。
这里是老问题,但接受的答案在技术上是错误的。我没有对此进行测试,但我相信如果您使用 pkgconf 而不是原始的 pkg-config,它会支持 Cflags.private 字段。不,您不能从同一个 .pc 文件传递一组完全不同的 CFLAGS,但这没关系。
您只需在 .pc 文件中使用 Cflags.private。这也将通过正常的 CFLAGS,但您可以通过另外使用未定义标志来修复它。例如:
Cflags:-DFOO_DYNAMIC
Cflags.private: -UFOO_DYNAMIC -DFOO_STATIC
我想提供一个(另外)支持静态 linking 的 pkg-config 文件。
通常你可以用这样的东西来做到这一点:
Libs: -L${libdir} -lfoo
Libs.private: -L${libdir} -lbar
Cflags: -I${includedir} -DFOO
这将产生:
$ pkg-config --cflags foo
-I/usr/local/include -DFOO
$ pkg-config --libs foo
-L/usr/local/lib -lfoo
$ pkg-config --static --cflags foo
-I/usr/local/include -DFOO
$ pkg-config --static --libs foo
-L/usr/local/lib -lfoo -lbar
不幸的是,我的库 foo 需要在 linking dynamically/statically 和 link 时使用不同的预处理器定义不同版本的库。
所以期望的输出是:
$ pkg-config --cflags foo
-I/usr/local/include -DFOO_DYNAMIC
$ pkg-config --libs foo
-L/usr/local/lib -lfoo
$ pkg-config --static --cflags foo
-I/usr/local/include -DFOO_STATIC
$ pkg-config --static --libs foo
-L/usr/local/lib -lfoo_static
所以问题是:
- 是否可以为
static
变体提供 不同的 CFLAGS/LIBS 而不仅仅是 在顶部添加 动态变体的?
简答:否
解决方法是提供一个不同的 .pc 文件,命名为 foo-static.pc 或类似名称。
这里是老问题,但接受的答案在技术上是错误的。我没有对此进行测试,但我相信如果您使用 pkgconf 而不是原始的 pkg-config,它会支持 Cflags.private 字段。不,您不能从同一个 .pc 文件传递一组完全不同的 CFLAGS,但这没关系。
您只需在 .pc 文件中使用 Cflags.private。这也将通过正常的 CFLAGS,但您可以通过另外使用未定义标志来修复它。例如:
Cflags:-DFOO_DYNAMIC
Cflags.private: -UFOO_DYNAMIC -DFOO_STATIC