idea更改包名出现 Package ‘com‘ contains directories in libraries which cannot be renamed

本文详细描述了如何在项目中更换包名,包括创建新目录、全局替换、修改jar包依赖、使用jarjar工具重打包,以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想更改项目中的包名,结果出现以上问题,然后去百度搜索看半天无果,搞了一下午才弄好,以下是解决放法。

1.找到要更改的目录,创建想更改包名名字的文件夹,把之前文件目录里的文件剪切到自己创建的文件夹在这里插入图片描述

2.ctrl+shift+r进行全局替换 我是把daowen改成hyc

在这里插入图片描述

这几个(java,xml等)都点下,看有没有,daowen这个是之前的,然后想更改hyc

在这里插入图片描述

如果下面显示跟第一张图那样,点全替换

3.然后这里是之前导入jar包的目录报错在这里插入图片描述

紧接着更改jar包的目录结构

首先找到导入的jar包路径,

1)创建rule.txt,下载jarjar-1.1.jar
方式一:http://www.java2s.com/Code/Jar/j/Downloadjarjar11jar.htm

方式二:链接:https://pan.baidu.com/s/16H7DqAyH05d76M6BlprKpw
提取码:h2fy

2)解压缩,之后如图所示

在这里插入图片描述
在这里插入图片描述

3)rule com.daowen.** com.hyc.@1
前面是之前文件的目录结构,后面是想更改后的目录结构

在这里插入图片描述

4)点击此刻的上方目录,输入cmd

在这里插入图片描述

5)输入java -jar jarjar-1.1.jar process rule.txt simple-dev-2.0.2 simple-dev-2.0.2在这里插入图片描述
前面simple-dev-2.0.2是之前jar包的名字,后面是要更改的名字,(因为我不想改名字,所以是一样的)
  • 输完之后按回车,如果没有显示其他的,就说明改好了
    在这里插入图片描述
    在这里插入图片描述
更改成功
进入idea看一下

在这里插入图片描述

注意!!!,有的类idea没给你改完,可能会出现 com. .entity,之后再全局搜“…”,如果全改完之后有的路径要你自己重新看着恢复,

比如 com.hyc.entity这类就不用管他,如果是图片路径,就继续…

之后 tld文件没给你改,你需要手动修改,然后把target文件删除,重启服务

在这里插入图片描述

<think>我们正在处理一个CMake配置错误:`Cannotspecifylinklibrariesfortarget"main"whichisnotbuiltbythisproject.`。根据引用内容,此错误通常发生在以下情况:1.在`target_link_libraries`命令之前没有通过`add_executable`或`add_library`定义目标。2.目标名称拼写不一致。3.目标在`target_link_libraries`之后定义(顺序错误)。4.存在非目标构建的库(如外部库)被错误地当作本项目的目标。5.可能存在隐藏字符(如中文空格)导致解析错误。根据用户的具体错误信息:`cmakeerror:Cannotspecifylinklibrariesfortargetwhichisnotalibrarytarget,cmakesetlinklibrariesforlibswitch_uilib.so`,这里的目标是`libswitch_uilib.so`,是一个共享库(librarytarget)。错误信息表明,CMake认为这个目标不是由当前项目构建的,因此不能为其指定链接库。**问题分析:**-如果`libswitch_uilib.so`是当前项目需要构建的库,那么应该在`target_link_libraries`之前使用`add_library`命令定义它。-如果`libswitch_uilib.so`是外部库(不是由当前项目构建的),那么不能使用`target_link_libraries`直接给它添加链接库。因为`target_link_libraries`只能用于在当前项目中定义的目标(通过`add_executable`或`add_library`添加的目标)。对于外部库,应该使用`link_libraries`(全局链接)或者将其链接到你的可执行文件或库目标上。**解决方案:****情况1:`libswitch_uilib.so`是当前项目需要构建的库**1.确保在`target_link_libraries`之前使用`add_library`定义目标`libswitch_uilib.so`。2.检查目标名称是否完全一致(注意大小写)。3.确保`add_library`和`target_link_libraries`在同一个CMakeLists.txt文件中,且在同一作用域。示例:```cmake#定义共享库目标add_library(switch_uilibSHAREDsource1.cppsource2.cpp)#然后为这个目标链接其他库target_link_libraries(switch_uilibPRIVATEsome_other_library)```注意:目标名称在`add_library`中为`switch_uilib`,生成库文件为`libswitch_uilib.so`(在Unix系统上),所以`target_link_libraries`中应使用目标名`switch_uilib`而不是库文件名`libswitch_uilib.so`。**情况2:`libswitch_uilib.so`是外部库(非本项目构建)**如果`libswitch_uilib.so`是外部库,那么你不应该尝试为这个外部库目标添加链接库。相反,你应该将外部库链接到你的可执行文件或库目标上。例如,假设你有一个可执行文件需要链接`libswitch_uilib.so`和另一个库`libdependency.so`:```cmake#先定义你的可执行文件目标add_executable(my_mainmain.cpp)#然后将外部库链接到你的可执行文件target_link_libraries(my_mainPRIVATEswitch_uilibdependency)```这里,`switch_uilib`和`dependency`应该是通过`find_library`找到的库变量名,或者是通过`find_package`导入的目标,或者直接写库的全路径。如果你确实需要为外部库添加额外的链接库(这种情况较少见),你可能需要创建一个新的接口库(interfacelibrary)来组合它们,或者使用`link_libraries`命令(全局链接,不推荐)。**其他可能的问题:**-**目标作用域问题**:如果`add_library`定义在一个子目录中,并且没有将该目标导出到父目录,那么在父目录的CMakeLists.txt中可能无法看到这个目标。可以使用`add_subdirectory`并在子目录中使用`target_link_libraries`,或者将目标提升到全局作用域(使用`set_target_properties`和`GLOBAL`属性)。-**隐藏字符**:检查CMakeLists.txt中是否存在不可见的字符(如中文空格)。建议使用纯文本编辑器查看并确保使用英文空格。-**路径问题**:如果`libswitch_uilib.so`位于某个目录,确保该目录在`link_directories`中指定,或者使用绝对路径。**步骤总结:**1.确定`libswitch_uilib.so`是内部目标还是外部库。2.如果是内部目标,确保在`target_link_libraries`之前用`add_library`定义,且名称一致。3.如果是外部库,则不能为它使用`target_link_libraries`,而应该将它链接到你的目标(可执行文件或库)上。4.检查CMakeLists.txt文件的语法(包括隐藏字符)和顺序。根据用户提供的引用[3],我们特别强调:**必须确保在调用`target_link_libraries`之前,目标已经被`add_executable`或`add_library`定义,并且目标名称完全一致**。如果问题仍然存在,请检查CMakeLists.txt文件的完整结构,并确保没有其他逻辑错误。§§相关问题§§1.如何正确使用`add_library`定义共享库目标?2.在CMake中,如何链接外部共享库?3.如何解决CMake目标作用域问题(例如,子目录中定义的目标在父目录中不可见)?4.如何检测并修复CMakeLists.txt中的隐藏字符问题?</think>### CMake错误:无法为未构建目标指定链接库 #### 问题分析 错误信息 `Cannot specify link libraries for target "libswitch_uilib.so" which is not built by this project` 的根本原因是:**CMake无法识别 `libswitch_uilib.so` 作为当前项目构建的目标**。根据引用内容[^3][^4],主要原因包括: 1. **目标未定义** `target_link_libraries` 之前缺少 `add_library` 或 `add_executable` 声明目标 ▶ 例如:未执行 `add_library(switch_uilib SHARED ...)` 2. **目标名称不匹配** `add_library` 中使用的目标名与 `target_link_libraries` 中名称不一致 ▶ 例如:`add_library(switch_uilib ...)` 但调用 `target_link_libraries(libswitch_uilib.so ...)` 3. **执行顺序错误** `target_link_libraries` 出现在 `add_library` 之前(CMake 按顺序解析) 4. **外部库误操作** `libswitch_uilib.so` 是外部预编译库,但被当作当前项目目标操作 5. **隐藏字符问题** CMakeLists.txt 中存在中文空格等不可见字符(引用[^4]) --- #### 解决方案 ##### ✅ 情况1:目标在项目中构建(需修复定义) ```cmake # 正确顺序示例 add_library(switch_uilib SHARED src1.cpp src2.cpp) # 先定义目标 target_link_libraries(switch_uilib PUBLIC pthread) # 再链接库 ``` **关键点:** - 使用 **目标名**(`switch_uilib`)而非库文件名(`libswitch_uilib.so`) - 确保 `add_library` 在 `target_link_libraries` **之前** ##### ✅ 情况2:目标为外部库(需修改链接方式) ```cmake # 正确链接外部库的两种方式 # 方式1:直接链接到你的可执行文件 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE /path/to/libswitch_uilib.so) # 方式2:通过find_library定位 find_library(SWITCH_LIB NAMES switch_uilib PATHS /opt/libs) target_link_libraries(my_app PRIVATE ${SWITCH_LIB}) ``` ##### ✅ 通用检查步骤 1. **验证目标定义** 搜索 `add_library(switch_uilib` 或类似语句,确认存在且名称匹配 2. **检查执行顺序** 确保所有 `target_link_libraries` 出现在对应 `add_library` **之后** 3. **排除隐藏字符** 用 `hexdump -C CMakeLists.txt` 检查异常字符(尤其中文空格) 4. **作用域验证** 若目标在子目录定义,需用 `add_subdirectory()` 引入作用域 --- #### 典型错误案例修正 **错误CMakeLists.txt:** ```cmake target_link_libraries(libswitch_uilib.so pthread) # ❌ 出现在add_library之前 add_library(libswitch_uilib SHARED src.cpp) # ❌ 使用文件名而非目标名 ``` **修正后:** ```cmake # 正确定义目标 add_library(switch_uilib SHARED src.cpp) # ✅ 使用目标名 # 正确链接依赖 target_link_libraries(switch_uilib PUBLIC pthread) # ✅ 使用目标名且顺序正确 ``` > 引用说明:目标必须通过 `add_library` 或 `add_executable` 显式定义后才能在链接命令中使用[^3],且需注意名称一致性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值