安卓link.cpp中加入本地库名字
时间: 2023-07-25 13:07:14 浏览: 37
在安卓的 link.cpp 文件中,加入本地库的名称需要进行以下操作:
1. 打开 link.cpp 文件,找到 LOCAL_SHARED_LIBRARIES 或 LOCAL_STATIC_LIBRARIES 一行。
2. 在这一行下面,添加一个新的本地库名称。例如,如果你想添加一个名为 "mylibrary" 的本地库,则可以这样写:
```
LOCAL_SHARED_LIBRARIES := mylibrary
```
3. 如果你要添加多个本地库,可以在同一行上用空格或逗号分隔它们。例如:
```
LOCAL_SHARED_LIBRARIES := mylibrary1 mylibrary2
```
4. 如果你的本地库是静态库,则将 LOCAL_SHARED_LIBRARIES 替换为 LOCAL_STATIC_LIBRARIES。
5. 保存文件并重新编译你的应用程序。
相关问题
安卓link.cpp中将自己so文件加入白名单
在安卓系统中,为了保证应用程序的安全性,系统会限制应用程序的行为,特别是对于一些敏感操作,例如加载动态链接库(so文件)的操作。
为了允许应用程序加载自己的so文件,需要将自己的so文件加入到系统的白名单中。具体步骤如下:
1. 在应用程序的Android.mk中指定so库的名称和路径,例如:
```
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := lib/mylib.so
```
2. 在应用程序的AndroidManifest.xml中添加以下权限:
```
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
3. 在应用程序中调用以下代码:
```
#include <unistd.h>
#include <sys/auxv.h>
const char *kLdPaths[] = {
"/system/lib",
"/system/vendor/lib",
"/system/vendor/lib64",
NULL
};
void AddMySoToLdLibraryPath() {
char ldpaths[1024];
size_t size = 0;
// 获取当前的LD_LIBRARY_PATH环境变量
const char* ld_library_path = getenv("LD_LIBRARY_PATH");
// 拼接新的LD_LIBRARY_PATH环境变量,将自己的so库路径加入
for (size_t i = 0; kLdPaths[i]; ++i) {
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
"%s%s", kLdPaths[i], ":");
}
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
"%s/lib/", getenv("ANDROID_ROOT"));
if (ld_library_path != nullptr) {
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
":%s", ld_library_path);
}
// 设置LD_LIBRARY_PATH环境变量
setenv("LD_LIBRARY_PATH", ldpaths, 1);
// 加载自己的so库
void* handle = dlopen("libmylib.so", RTLD_NOW | RTLD_GLOBAL);
// 恢复原来的LD_LIBRARY_PATH环境变量
setenv("LD_LIBRARY_PATH", ld_library_path ? ld_library_path : "", 1);
}
```
在应用程序启动时调用AddMySoToLdLibraryPath()函数即可将自己的so文件加入到系统的白名单中。
现有如下cmake项目,根目录下包含一个include文件夹,内有header.h,根目录下还有src文件夹,内有文件main.cpp,header.cpp,两个文件均引用header.h,src文件夹以及项目根目录下均有cmakelists.txt,main.cpp中使用了在header.cpp中定义的函数,但是构建时出现undefined_reference
出现 undefined reference 的原因是链接器没有找到对应的函数实现。在你的项目中,需要将 header.cpp 编译成一个库文件(静态库或动态库),然后在链接时将该库文件链接到你的可执行文件中。
具体操作方法如下:
1. 在 header.cpp 中定义的函数前面加上 `extern "C"`,例如:
```c++
extern "C" {
void my_function() {
// function implementation
}
}
```
这样可以避免 C++ 名字修饰导致的链接错误。
2. 在根目录下的 CMakeLists.txt 中添加以下内容:
```cmake
# 编译 header.cpp 为一个静态库
add_library(mylib STATIC ${CMAKE_CURRENT_SOURCE_DIR}/header.cpp)
# 或编译为一个动态库
# add_library(mylib SHARED ${CMAKE_CURRENT_SOURCE_DIR}/header.cpp)
# 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 编译可执行文件
add_executable(myapp ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
# 链接静态库
target_link_libraries(myapp mylib)
# 或链接动态库
# target_link_libraries(myapp mylib_shared)
```
这样就可以将 header.cpp 编译成一个库文件,并将其链接到可执行文件中,解决 undefined reference 的问题。