我想在配置时添加对项目所需的库的最小版本的检查。
库本身将其版本存储在结构中
library_name_version_struct
,这样我就可以使用以下代码获取库版本:
#include "library_name.h"
void main(void){
printf("%s\n", library_name_version_struct.version);
}
这会给我输出
libraryMAJOR.MINOR.MICRO
我想尝试让 autoconf 运行最少的代码,捕获输出,然后(至少作为开始)只是愚蠢地检查输出字符串是否在我指定的允许输出字符串列表中。类似于
的东西AC_MAGIC_COMMAND_THAT_I_DONT_KNOW( [[#include "library_name.h"],
[printf("%s\n", library_name_version_struct.version);]],
[STORE_OUTPUT_IN_THIS_VARIABLE],
[Oh no something went really wrong])
case STORE_OUTPUT_IN_THIS_VARIABLE in
library_name1.0.0 | library_name1.1.0 | (etc...) | library_name3.1.0)
# we good
;;
*)
AC_MSG_ERROR([STORE_OUTPUT_IN_THIS_VARIABLE is not a permitted version])
;;
esac
任何其他或更好的方法来实现这一点也将非常感激。我只是想让这个发挥作用。
您正在寻找的 Autoconf 宏是
AC_RUN_IFELSE
。
AC_RUN_IFELSE([dnl
AC_LANG_PROGRAM([[
#include <stddef.h>
#include <string.h>
]], [[
const char *known_good[] = {
"library_name1.0.0",
"library_name1.1.0",
...
"library_name3.1.0",
NULL
};
const char *version_string = library_name_version_struct.version;
for (size_t i=0; known_good[i] != NULL; ++i) {
if (strcmp(known_good[i], version_string) == 0) {
return 0; /* we good */
}
}
return 1; /* we not good */
]])
], [dnl
AC_MSG_RESULT([yesss])
], [dnl
AC_MSG_RESULT([noooo])
AC_MSG_ERROR([cross-compiling, library_name not found, error compiling with or linking against library_name, or unsupported library_name version])
])
但是,使用
AC_RUN_IFELSE
检查 library_name_version_struct.version
的运行时值至少存在两个问题:
AC_RUN_IFELSE
交叉编译时无法检测库版本。
构建二进制程序时存在的库版本可能与编译后的程序最终运行时使用的库版本不同。
我会尝试寻找不同的机制来检查库版本。检查一些用于编译的最低 ABI 版本(例如,如果相关库支持该版本,则使用
PKG_CHECK_MODULES
),然后可能对已编译程序内部进行实际的运行时检查。
有关相关库的更多详细信息或具体指针可能会提供更有用的答案。