• 最新文章
  • linux
  • php
  • sql
  • 服务端
  • tool
  • cocos

CLion编译C++程序的exe文件无法在windows下正常运行

简单解决方案: set(CMAKE_EXE_LINKER_FLAGS "-static") 在CLion中使用CMake编译C++项目 时,添加了set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")后程序运行正常,这表明问题的根本原因是动态链接的运行时库缺失或不匹配。下面详细分析原因: 问题的根本原因 C++程序在运行时依赖两个重要的运行时库: libgcc:GCC编译器的底层支持库,提供异常处理、线程支持等功能。 libstdc++:GCC的C++标准库实现,包含STL、IO流、字符串等C++核心功能。 如果没有静态链接这些库,程序会默认动态链接它们,这意味着生成的exe文件运行时需要系统中有对应的动态链接库(DLL)。如果这些DLL缺失或版本不匹配,程序就会闪退。 为什么C程序正常,而C++程序闪退? C程序:C语言的标准库(如libc)在Windows系统中通常由系统自带的MSVCRT(Microsoft C Runtime)提供,因此即使动态链接,运行时也不会缺少依赖。 C++程序:C++标准库(libstdc++)不是Windows系统自带的,如果动态链接,程序运行时需要找到对应的libstdc++-6.dll。如果系统中没有这个DLL,或者版本不匹配,程序就会闪退。 -static-libgcc 和 -static-libstdc++ 的作用 -static-libgcc:将libgcc静态链接到可执行文件中,不再依赖外部的libgcc DLL。 -static-libstdc++:将libstdc++静态链接到可执行文件中,不再依赖外部的libstdc++-6.dll。 通过这两个选项,编译器 会将运行时库的代码直接嵌入到生成的exe文件中,从而避免了运行时依赖外部DLL的问题。 为什么添加这些选项后程序正常? 添加-static-libgcc和-static-libstdc++后: 生成的exe文件不再依赖外部的libstdc++-6.dll和libgcc DLL。 程序运行时不需要在系统中查找这些DLL,因此不会因为DLL缺失或版本问题而闪退。 更深层次的原因分析 (1)动态链接的运行时库路径问题 如果系统中安装了多个版本的GCC或MinGW,可能会导致libstdc++-6.dll的版本冲突。 如果libstdc++-6.dll不在系统的PATH环境变量中,程序运行时无法找到它。 (2)CLion的默认行为 CLion使用CMake构建项目时,默认会动态链接运行时库(除非显式指定静态链接)。 如果开发环境和运行环境不一致(例如开发环境中有libstdc++-6.dll,而运行环境中没有),程序就会闪退。 (3)Windows平台的限制 Windows系统本身不提供GCC的运行时库(如libstdc++),因此动态链接时,必须确保目标系统中有正确的DLL。 相比之下,Linux系统通常自带libstdc++,因此动态链接的问题较少。 解决方案 除了添加-static-libgcc和-static-libstdc++,还可以考虑以下解决方案: (1)静态链接所有依赖 在CMake中显式指定静态链接: set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") -static会将所有依赖库(包括系统库)静态链接到可执行文件 中。 (2)分发运行时库 如果不想静态链接,可以将libstdc++-6.dll和libgcc_s_seh-1.dll(或其他版本的DLL)与exe文件一起分发,并确保它们在同一个目录下。 (3)使用MSVC编译器 如果目标平台是Windows ,可以考虑使用Microsoft Visual C++(MSVC)编译器,而不是MinGW。MSVC的运行时库(MSVCRT)是Windows系统自带的,因此动态链接时不会出现依赖问题。 (4)检查环境变量 确保libstdc++-6.dll所在的目录在系统的PATH环境变量 中。 总结 问题的根本原因是C++程序动态链接了libstdc++和libgcc,而目标系统中缺少这些DLL或版本不匹配。通过添加-static-libgcc和-static-libstdc++,将运行时库静态链接到exe文件中,避免了运行时依赖问题。 如果你的程序需要在多个平台上分发,建议静态链接所有依赖,或者将所需的DLL与exe文件一起分发。如果仅用于开发环境,可以确保开发环境和运行环境的一致性。 原文链接:https://blog.csdn.net/ChenBiLu/article/details/145509318

clion 中文乱码

1.终端乱码: 双击Shit,跳出搜索界面,输入Registry,点击进入。 去掉“run.processes.with.pty”中默认的对勾,不要勾选该选项,close退出。 运行程序,中文显示正常。 clion 发布exe 中文乱码 #include <iostream> #include <windows.h> int main() { // 设置控制台输出为 UTF-8 SetConsoleOutputCP(CP_UTF8); // 确保读取控制台输入也为 UTF-8 SetConsoleCP(CP_UTF8); std::wcout.imbue(std::locale("chs")); // 对于宽字符输出,使用中文语言环境 std::wcout << L"你好,世界!" << std::endl; return 0; }

linux重启后 mysql 事件未触发

在Linux系统中,如果你发现MySQL的事件(Event Scheduler)在重启后没有触发,这通常是因为事件调度器(Event Scheduler)没有被启用。MySQL的事件调度器是一个独立的组件,默认情况下是关闭的。要启用它,你可以按照以下步骤操作: 启用事件调度器 你可以通过MySQL的命令行工具来启用事件调度器。首先,登录到MySQL服务器: mysql -u yourusername -p 然后,执行以下SQL命令来启用事件调度器: ```bash SET GLOBAL event_scheduler = ON; 这会立即启用事件调度器。如果你希望在MySQL服务器重启后也保持启用状态,你需要将这个设置加入到MySQL的配置文件中(通常是my.cnf或my.ini,取决于你的操作系统和MySQL的安装方式)。找到或创建一个名为的部分,并添加或修改以下行: event_scheduler=ON 保存配置文件并重启MySQL服务: sudo systemctl restart mysql 或者,如果你使用的是老版本的MySQL,可能需要使用: sudo service mysql restart 检查事件调度器状态 为了确认事件调度器已经启用,你可以再次登录到MySQL并执行以下命令: SHOW VARIABLES LIKE 'event_scheduler'; 这将返回event_scheduler的状态,应该是ON。 创建和测试事件 确保事件调度器已启用后,你可以创建一个测试事件来验证它是否按预期工作。例如: CREATE EVENT simple_event ON SCHEDULE EVERY 1 MINUTE DO UPDATE some_table SET column_name = column_name + 1; 这个事件每分钟更新some_table表中的column_name字段。你可以通过查看表来确认事件是否按预期触发。 4. 调试问题 如果事件仍然不触发,检查以下几点: 确保MySQL用户有足够的权限来创建和修改事件。通常需要EVENT权限。 查看MySQL的错误日志(通常位于/var/log/mysql/error.log),看是否有关于事件的错误信息。 确认没有其他MySQL配置或系统设置(如防火墙或SELinux策略)阻止事件的正常工作。 通过上述步骤,你应该能够解决在Linux重启后MySQL事件未触发的问题。如果问题仍然存在,可能需要更详细地检查具体的错误日志或系统日志以找到问题的根源。

Go语言中动态解析混合类型JSON数组的实用技巧

Go语言中动态解析混合类型JSON数组的实用技巧在Go语言中处理包含多种不同类型元素且顺序不固定的JSON数组时,传统结构体映射方式无法胜任。通过interface{}和类型断言机制,可以实现动态、递归的解析,灵活处理未知或多变的JSON数据结构。 核心挑战 当JSON数组包含多种类型(字符串、数字、布尔值、嵌套对象或数组)且元素顺序不固定时,直接结构体映射不再适用。例如: { "an_array": } ]} 传统方法如使用json.RawMessage需要预先知道每个索引处的具体类型,对动态结构不够灵活。 动态解析策略 使用interface{} Go语言的interface{}(空接口)可表示任何类型值。encoding/json包解码时: JSON对象解码为mapinterface{} JSON数组解码为interface{} 字符串解码为string 数字解码为float64 布尔值解码为bool null解码为nil 通过将整个JSON结构解码到interface{}变量,再利用类型断言动态识别和处理各部分。 核心实现:递归遍历与类型断言 编写递归函数处理任意深度嵌套结构,根据具体类型执行相应操作。示例代码如下: package mainimport ( "encoding/json" "fmt")var myJSON string = { "an_array": , "value": 45.67 } ]}func processDynamicJSON(data interface{}, indent string) { switch v := data.(type) { case mapinterface{}: fmt.Printf("%s是对象 (mapinterface{}):n", indent) for key, val := range v { fmt.Printf("%s 键 '%s': ", indent, key) processDynamicJSON(val, indent+" ") } case interface{}: fmt.Printf("%s是数组 (interface{}):n", indent) for i, val := range v { fmt.Printf("%s 索引 %d: ", indent, i) processDynamicJSON(val, indent+" ") } case string: fmt.Printf("%s是字符串 - "%s"n", indent, v) case float64: if v == float64(int(v)) { fmt.Printf("%s是整数 - %dn", indent, int(v)) } else { fmt.Printf("%s是浮点数 - %fn", indent, v) } case bool: fmt.Printf("%s是布尔值 - %tn", indent, v) case nil: fmt.Printf("%s是空值 (nil)n", indent) default: fmt.Printf("%s是未知类型 - %Tn", indent, v) }}func main() { fmt.Println("原始JSON:n", myJSON, "n") var f interface{} err := json.Unmarshal(byte(myJSON), &f) if err != nil { fmt.Println("JSON解析错误:", err) return } fmt.Println("开始动态解析:") processDynamicJSON(f, "")}代码分析 myJSON:包含多种类型(字符串、整数、布尔值、空值、嵌套对象和数组)的复杂JSON字符串。 json.Unmarshal(byte(myJSON), &f):将整个JSON字符串解码到interface{}类型变量f中,最外层为mapinterface{}。 processDynamicJSON(data interface{}, indent string): 接收interface{}类型data和格式化输出indent字符串。 使用switch v := data.(type)类型断言检查实际底层类型。 case mapinterface{}:遍历map,递归处理每个键值对。 case interface{}:遍历切片,递归处理每个元素。 case string、case float64、case bool、case

Go语言 字典(map)

字典(map) 哈希表,key=>value,存储的key是经过哈希运算的 定义字典 定义一个学生信息字典。 示例如下: package main import "fmt" func main() { // 定义一个学生信息字典 // key是学生id =》 学生姓名 var idNames mapstring // 定义一个map,此时的map不能直接赋值的,它是空的 } 分配空间 使用map之前,一定要对map手动进行分配空间 若不分配空间直接使用,程序会抛出异常。 未分配空间直接赋值 示例如下: // 赋值 idNames = "张三" idNames = "李四" 抛出异常: panic: assignment to entry in nil map goroutine 1 : main.main() E:/gowork/src/字典.go:11 +0x2a 分配空间及赋值 对学生信息字典赋值前,增加分配空间操作。 示例如下: // 分配空间 idNames = make(mapstring, 10) // 赋值 idNames = "张三" idNames = "李四" 运行不在抛出异常。 分配空间但不指定长度 分配空间使用make,可以不指定长度,但是建议直接指定长度,性能会更好。 示例如下: idNames = make(mapstring) 定义时分配空间 也可以在定义时直接分配空间,防止定义后忘记分配空间导致抛出异常。 这种方式在日常使用中比较常见。 示例如下: idName1 := make(mapstring, 10) 遍历 对map进行遍历 示例如下: for key, val := range idNames { fmt.Println(key, "=>", val) } 判断key是否存在 访问不存在的key 如果判断一个key是否存在map中。 在map中不存在访问越界的问题,它认为所有的key都是有效的。 所以如果访问一个不存在的key并不会崩溃或者抛出异常, 只会返回这个类型的零值。 零值:bool => false, 数字 => 0,字符串 => 空 通过ok判断key是否存在 无法通过获取value来判断一个key是否存在, 因此我们需要一个能够校验key是否存在的方式 我们可以通过ok方式来进行判断。 如果key存在,那么value就是key对应的值,ok返回true;反之返回零值,ok返回false。 示例如下: value, ok := idNames if ok { fmt.Println("id=12这个key存在,value为:", value) } else { fmt.Println("id=12这个key不存在") } 删除元素 使用自由函数delete来删除map中指定key 删除存在和不存在的key 示例如下: fmt.Println("idNames删除前:", idNames) delete(idNames, 1) delete(idNames, 15) fmt.Println("idNames删除后:", idNames) 运行结果: idNames删除前: map idNames删除后: map 转自:https://blog.csdn.net/json_ligege/article/details/140488531

Cocos Creator 之 Label的实际宽高改变文本背景大小及常用方法

有些情况下,我们需要根据文本的宽、高动态设置文本背景的大小。 这里汇总了几种一些案例,以及一些文本转换的常用方法,希望对您有用。 下面是3.0以后的,主要用到的是强制刷新label,然后可以获取实际的宽高 label.updateRenderData(true) const desc = "这是一段文本内容这是一段文本内容"; const label = this.labelNode.getComponent(Label); label.string = desc; // 立即更新渲染数据,用于获取文本的实际宽高 label.updateRenderData(true); // 检测文本宽度是否超过限定宽度,倘若超过则设置溢出模式 const labelWidth = this.labelNode.getComponent(UITransform).width; if (labelWidth > 450) { label.overflow = Overflow.RESIZE_HEIGHT; this.labelNode.getComponent(UITransform).width = 450; label.updateRenderData(true); } // 根据文本的宽高设置修改背景宽高 const labelSize = this.labelNode.getComponent(UITransform).contentSize; const bgTransform = this.bgNode.getComponent(UITransform); bgTransform.setContentSize(labelSize.width, labelSize.height); 2.x的版本里强制刷新label的方法是:_forceUpdateRenderData(); label.getComponent(cc.Label).string = msg; label.getComponent(cc.Label)._forceUpdateRenderData(); 转自:https://blog.csdn.net/qq_24726043/article/details/148216548

Creator3打包WebMobile 报错 Access to script at ‘chunks:///_virtual/xxxxx.ts‘ from origin ‘http://localhost:7456’ has been blocked by CORS

发布web版本后老是报这个错误: Access to script at 'chunks:///_virtual/xxxxxxx.ts' from origin 'http://xxxxx:7456' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted. 解决方案是: 勾选“擦除模块结构”就正常了

魔方速成教学大全,高级玩法CFOP合集

资源名称 魔方高级玩法CFOP合集 资源链接 百度网盘:https://pan.baidu.com/s/12woQC4RXN7ZY-iMYcqLJxQ#list/path=%2F 提取码: 45cy 魔方速成教学大全,带娃必备神技 百度云盘:https://pan.baidu.com/s/14biOyNbKxp0iroO54at1wg 提取码:c475